【问题标题】:Passing each column of a table to a UDF将表的每一列传递给 UDF
【发布时间】:2017-03-20 16:07:38
【问题描述】:

我需要用 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 中,然后在那里进行所有处理?

【问题讨论】:

  • 您是否尝试将 UDF 分别应用于每一列?或者 UDF 是否采用列的某些子集?我不太了解您尝试生成的查询的形状。
  • 我需要一次将每一列传递给 UDF

标签: javascript python sql google-bigquery udf


【解决方案1】:

目前无法在不枚举所有列的情况下将用户定义的函数单独应用于表中的每一列。一种想法是改为进行基于行的处理,尽管这仍然需要将列名和类型列为函数定义的一部分。例如:

#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 注册您的兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2020-06-16
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多