在BigQuery

时间:2017-06-19 08:02:17

标签: sql google-bigquery google-cloud-platform udf gcp

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

但是,我需要的是在select作为列中使用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 个答案:

答案 0 :(得分:2)

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

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

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

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

在Legacy SQL中你可以通过仅从UDF中暴露location_title来进行欺骗。

同样在标准SQL中你可以

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