【问题标题】:Using UDF as a column in a query in BigQuery在 BigQuery 的查询中使用 UDF 作为列
【发布时间】: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'

【问题讨论】:

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


    【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多