在 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]
我有一个 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]