在选择

时间:2016-10-05 14:54:20

标签: google-bigquery user-defined-functions udf

我有一个表,其中包含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]

2 个答案:

答案 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]