如何在云数据实验室创建和使用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))
我使用命令创建了一个名为 "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))