如何在云数据库上创建和使用UDF?

时间:2015-11-11 08:46:32

标签: google-bigquery google-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
);

然后,它返回错误。

  

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?

2 个答案:

答案 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