如何在云数据实验室创建和使用UDF?

How to create and use UDF on cloud datalab?

我使用命令创建了一个名为 "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
);

然后,它返回错误。

The JavaScript must declare the input row and output emitter parameters using valid jsdoc format comments. The input row param declaration must be typed as {{field:type, field2:type}} and the output emitter param declaration must be typed as function({{field:type, field2:type}}.

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

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

和 运行 sql 命令。但是还是报错"Unknown TVF: passthrough".

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

如何声明参数,然后在数据实验室中使用 UDF?

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

您可以在我们的 github 存储库中跟踪一些进度 -- https://github.com/GoogleCloudPlatform/datalab ... and you can see a sample of the existing support (that will change) here: https://github.com/GoogleCloudPlatform/datalab/blob/master/dev/notebooks/BigQuery%20-%20JavaScript%20UDFs.ipynb

您的 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 应用于 table,并执行如下操作:

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))