在 BigQuery 的查询中使用 UDF 作为列

Posted

技术标签:

【中文标题】在 BigQuery 的查询中使用 UDF 作为列【英文标题】:Using UDF as a column in a query in BigQuery 【发布时间】:2017-06-19 08:02:16 【问题描述】:

我在 BigQuery 中创建了一个 UDF,并设法像文档 (https://cloud.google.com/bigquery/user-defined-functions#creating-the-query) 中的示例一样运行它,其中 UDF 用于 FROM 子句。

但是,我需要的是在选择中使用 UDF 作为列。

举个例子 - 这是我的函数,它为每个坐标返回地球的四分之一:

function getQuarter(row, emit) 
  emit(quarter: getQuarterHelper(row.lon,row.lat));


function getQuarterHelper(lon,lat) 
  try 
    var NS = lat > 0 ? 'N' : 'S';
    var EW = lon > 0 ? 'E' : 'W';
    return(NS + EW);
   catch (ex) 
    return 'N/A';
  


bigquery.defineFunction(
  'getQuarter',
  ['lon', 'lat'], //input columns
  [name: 'quarter', type: 'string'], //output
  getQuarter
);

这行得通:

SELECT quarter
FROM 
  getQuarter(
     SELECT lon,lat
     FROM [table_name]
  )

但是,例如,这不是:

SELECT location_title, getQuarter(lon, lat)
FROM [table_name]

这两个都不是:

SELECT *
FROM [table_name]
WHERE getQuarter(lon,lat) = 'NE'

【问题讨论】:

【参考方案1】:

您最好在较新的标准 SQL 中定义您的 UDF,而不是在您有一些限制的旧版 SQL 中。

https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions

在标准 SQL 中,您可以这样做:

SELECT location_title, getQuarter(lon, lat)
FROM `table_name`

在旧版 SQL 中,您可以通过仅在内部暴露 UDF 中的 location_title 来欺骗。

您也可以在标准 SQL 中

SELECT getQuarter(lon,lat) as q
FROM `table_name`
WHERE q = 'NE'

【讨论】:

以上是关于在 BigQuery 的查询中使用 UDF 作为列的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 中使用引用另一个表的 UDF 的相关子查询错误

使用 Google Datalab,如何在 Google BigQuery 中使用 UDF 从复杂查询创建表?

使用 DataFlow Engine 运行 bigquery 查询时,如何使用 UDF(和其他函数)?

BigQuery 的 UDF 不支持 API 同步查询或者如何使用?

在 BigQuery 中使用 javascript udf 进行 tf idf 计算时,UDF 工作程序在执行期间超时

大查询 UDF 支持