我使用命令
创建了一个名为“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命令。但它仍然返回错误“Unknown TVF:passthrough”。
%%sql
SELECT outputA, outputB FROM (passthrough(SELECT "abc" AS inputA, "def" AS inputB))
如何声明参数,稍后在datalab上使用UDF?
答案 0 :(得分: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))
答案 1 :(得分:0)
我们目前拥有的UDF支持是在早期的UDF中进行的,当它们首次在BigQuery中引入时。我们正积极致力于更新我们的支持。
您可以在我们的github repo中跟踪一些进度 - https://github.com/GoogleCloudPlatform/datalab ...您可以在此处查看现有支持的示例(将会更改):https://github.com/GoogleCloudPlatform/datalab/blob/master/dev/notebooks/BigQuery%20-%20JavaScript%20UDFs.ipynb