【问题标题】:Using Big Query UDF during select在选择期间使用 Big Query UDF
【发布时间】:2017-02-14 02:22:34
【问题描述】:

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

另外,我在 BQ 中有以下 UDF 函数,它根据 MD5 和 crc32 值通过给定的 uuid 计算 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] )

这不是很有用,因为我想在几个不同的表中为 uuid 提取相同的 user_group,并且我不想每次要使用它时都定义函数“get_group”。此外,如果我想要表中的所有字段,我需要将结果与原始表连接起来,或者在 UDF 中硬编码表模式。

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

SELECT
  uuid,  
  get_group(uuid)
FROM
  [ANY_TABLE_WITH_UUID_FIELD]

【问题讨论】:

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


    【解决方案1】:

    使用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 界面中运行此查询,请取消选中“显示选项”下的“使用旧版 SQL”。

    【讨论】:

      【解决方案2】:

      我认为,对您来说最好的选择是使用 BigQuery 标准 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 2013-12-06
        相关资源
        最近更新 更多