1

我使用命令创建了一个名为“passthrough”的udf,

%%bigquery udf -m passthrough

function passthrough(row, emit) {
  emit({outputA: row.inputA, outputB: row.inputB});
}

bigquery.defineFunction(
  'passthrough',
  ['inputA', 'inputB'],
  [{'name': 'outputA', 'type': 'string'},
   {'name': 'outputB', 'type': 'string'}],
  passthrough
);

然后,它返回了错误。

JavaScript 必须使用有效的 jsdoc 格式注释声明输入行和输出发射器参数。输入行参数声明必须键入 {{field:type, field2:type}},输出发射器参数声明必须键入 function({{field:type, field2:type}}。

所以,我在 passthrough 函数上面添加了 jsdoc 注释,

/** 
 * @param {{field:string, field2:string}} row
 * @param function({{field:string, field2:string}}) emit 
 */

并运行 sql 命令。但它仍然返回错误“未知 TVF:直通”。

%%sql
SELECT outputA, outputB FROM (passthrough(SELECT "abc" AS inputA, "def" AS inputB))

如何声明参数,稍后在 datalab 上使用 UDF?

4

2 回答 2

1

您的 UDF 定义应为:

/** 
 * @param {{field:string, field2:string}} row
 * @param function({{field:string, field2:string}}) emit 
 */
function passthrough(row, emit) {
  emit({outputA: row.inputA, outputB: row.inputB});
}

如果您现在想使用 UDF,您将需要在 Python 代码中使用中间步骤,而当我们更新时,这将不再起作用(当您当前的操作方式应该基本正确时)。

您需要将 UDF 应用于表,并执行以下操作:

import gcp.bigquery as bq
tbl = bq.Query('SELECT "abc" AS inputA, "def" AS inputB').results()
udf_call = passthrough(tbl)

然后在你的 SQL 中:

%%sql
SELECT outputA, outputB FROM $udf_call

当更新到来时,你可以做你现在正在做的事情:

%%sql
SELECT outputA, outputB FROM (passthrough(SELECT "abc" AS inputA, "def" AS inputB))
于 2015-11-12T20:27:51.350 回答
0

我们目前拥有的 UDF 支持是针对早期在 BigQuery 中首次引入的 UDF 的。我们正在积极努力更新我们拥有的支持。

您可以在我们的 github 存储库中跟踪一些进度 - https://github.com/GoogleCloudPlatform/datalab ...您可以在此处查看现有支持的示例(将会更改):https://github。 com/GoogleCloudPlatform/datalab/blob/master/dev/notebooks/BigQuery%20-%20JavaScript%20UDFs.ipynb

于 2015-11-11T18:34:13.657 回答