在 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 同步查询或者如何使用?