在 select 期间使用 Big Query UDF

Using Big Query UDF during select

我有一个 table,其中包含用户的 uuid 和其他一些值。

此外,我在 BQ 中有以下 UDF 函数,它根据给定的 uuid,基于 MD5 和 crc32 值计算 user_group:

function GetGroup(uuid) {...
}

function getUserGroup(r, emit) {
emit ({group: GetGroup(String(r.uuid)), uuid: r.uuid
  });
}

bigquery.defineFunction(
'get_group',
['uuid'],    
[{'name': 'group', 'type': 'string'}, {'name': 'uuid', 'type': 'string'}],
getUserGroup);

因此,要提取用户价值,我需要执行以下操作:

SELECT
  group,
  uuid
FROM
  get_group(
    SELECT
      uuid
    FROM
      [MY_TABLE] )

这不是很有用,因为我想在几个不同的 table 中为 uuid 提取相同的 user_group 而我不想定义函数 "get_group"每次我想使用它。此外,如果我想要 table 中的所有字段,我需要使用原始 table 加入结果或在 UDF 中硬编码 table 模式。

有没有类似于Big Query中任何内置函数的方便的UDF使用方法?例如:

SELECT
  uuid,  
  get_group(uuid)
FROM
  [ANY_TABLE_WITH_UUID_FIELD]

使用 standard SQL; see also the user-defined function reference 表达这种过滤器要容易得多。这是一个例子:

CREATE TEMP FUNCTION get_group(uuid STRING) RETURNS STRING LANGUAGE js AS """
function get_group(uuid) {
  // (Your code here)
  return uuid + 'foo';
}

return get_group(uuid);
""";

WITH MyTable AS (
  SELECT uuid FROM UNNEST(['aaa', 'bbb', 'ccc']) AS uuid
)
SELECT uuid, get_group(uuid) AS `group`
FROM MyTable;

到 运行 BigQuery UI 中的此查询,取消选中 "Show Options" 下的 "Use Legacy SQL"。

我认为,对您来说最好的选择是使用 Scalar User-Defined Functions introduced with BigQuery Standard SQL (see Enabling Standard SQL)。

这为您提供了您正在寻找的极大程度的可组合性
注意 Including external libraries 特征。它允许您将繁重的代码引用为外部代码库,同时保持内联代码最少/可读等。

CREATE TEMP FUNCTION get_group(uuid STRING) 
  RETURNS STRING 
  LANGUAGE js AS 
"""
  return get_group(uuid);
"""

OPTIONS (
  library="gs://your-bucket/path/to/your-lib.js"
);

SELECT
  uuid,  
  get_group(uuid)
FROM
  [ANY_TABLE_WITH_UUID_FIELD]