将表的每列传递给UDF

时间:2017-03-20 16:07:39

标签: javascript python sql google-bigquery udf

我需要在Python中编写一个脚本,使用该脚本在bigquery上传的表的所有列上运行查询。 我知道我可以按名称选择单个列并处理它们,如: SELECT DISTINCT column_name FROM table_name 然后在javascript中编写一个UDF来进行处理。

但是,我的要求是获取模式的所有列名(假设为列表)然后逐个传递select语句中列表的元素,就像假设列名列表是l = [col1 ,COL2,COL3 ...] 我想做点什么:

for i in range(0,len(l):
    SELECT DISTINCT l[i] from table_name

这样我就不需要在代码中硬编码模式的列名。 我如何使用标准sql做这个bigquery? 或者它是不可能的,我需要将我的整个数据集传递给javascript UDF,然后在那里进行所有处理?

1 个答案:

答案 0 :(得分:0)

目前没有办法将用户定义的函数分别应用于表中的每个列而不枚举所有列。一种想法是改为基于行的处理,但仍需要列出列名和类型作为函数定义的一部分。例如:

#standardSQL
CREATE TEMP FUNCTION ProcessRow(t STRUCT<x FLOAT64, y STRING, z BOOL>)
RETURNS STRUCT<x FLOAT64, y STRING, z BOOL> LANGUAGE js AS """
  function ProcessColumn(x) {
    // (Some processing here)
    return x;
  }

  var new_t = new Object();
  for (var property in t) {
    if (t.hasOwnProperty(property)) {
      new_t[property] = ProcessColumn(t[property]);
    }
  }
  return new_t;
""";

WITH YourTable AS (
  SELECT 1 AS x, 'foo' AS y, true AS z
)
SELECT ProcessRow(t).*
FROM YourTable t;

如果BigQuery支持模板化函数,这将更简单,您可以star on the issue tracker注册您的兴趣。