我有一个表,其中包含uuid和其他一些用户值。
另外,我在BQ中有以下UDF函数,根据给定的uuid计算user_group,基于MD5和crc32值:
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] )
这不是很有用,因为我想在几个不同的表中为uuid提取相同的user_group,而且每次我想要使用它时都不想定义函数“get_group”。另外,如果我想要表中的所有字段,我需要将结果与原始表一起加入,或者在UDF中对表模式进行硬编码。
是否有任何方便的方法可以使用类似于Big Query中任何内置函数的UDF?例如:
SELECT
uuid,
get_group(uuid)
FROM
[ANY_TABLE_WITH_UUID_FIELD]
答案 0 :(得分:2)
使用standard SQL表达此类过滤器要容易得多;另见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中运行此查询,请取消选中"使用旧版SQL"在"显示选项"。
答案 1 :(得分:2)
我认为,最好的选择是使用BigQuery Standard SQL引入的Scalar User-Defined Functions(参见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]