【问题标题】:Applying BigQuery javascript UDF to groups将 BigQuery javascript UDF 应用于组
【发布时间】:2022-01-12 03:16:06
【问题描述】:

我正在尝试将 javascript 用户定义函数应用于组。在以下代码中,tuple 中的 --group by my_group 被注释掉。我想在test_data 内的每个my_group 上应用临时函数test。如果 group by 被注释掉,代码就会运行。如果我尝试包含分组依据,它会产生一个“标量子查询产生了多个元素”。我应该进行哪些更改才能为每个组输出一个数组 (my_group)?

#standardSQL create function
CREATE TEMP FUNCTION test(a ARRAY<STRING>) 
RETURNS ARRAY< STRING >
LANGUAGE js AS '''
  var combine = function(a) {
    var fn = function(n, src, got, all) {
      if (n == 0) {
        if (got.length > 0) {
          all[all.length] = got;
        } return;
      }
      for (var j = 0; j < src.length; j++) {
        fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all);
      } return;
    }
    var all = [];
    for (var i = 1; i < a.length; i++) {
      fn(i, a, [], all);
    }
    all.push(a);
    return all;
  } 
  return combine(a)
''';

 WITH test_data AS (
  SELECT  'Shirt' item, 'Cashless' my_group UNION ALL
  SELECT  'Jeans', 'Cashless' UNION ALL
  SELECT  'Jeans', 'Cash' UNION ALL
  SELECT  'Cap', 'Cash' UNION ALL
  SELECT  'Shirt', 'Cash' UNION ALL
  SELECT  'Cap', 'Cashless'

),

tuple as (  
  SELECT ARRAY_AGG(DISTINCT item) items
  FROM test_data

  --group by my_group (uncommenting it creates error)
)

select * from unnest(test((select items from tuple)))

我正在寻找如下输出:

my_group    Item
Cash        Shirt
Cash        Jeans
Cash        Cap
Cash        Shirt,Jeans
Cash        Shirt,Cap
Cash        Jeans,Cap
Cash        Shirt,Jeans,Cap
Cashless    Shirt
Cashless    Jeans
Cashless    Cap
Cashless    Shirt,Jeans
Cashless    Shirt,Cap
Cashless    Jeans,Cap
Cashless    Shirt,Jeans,Cap

【问题讨论】:

    标签: google-bigquery bigquery-udf


    【解决方案1】:

    考虑下面(省略功能块以保持答案足够紧凑......)

     WITH test_data AS (
      SELECT  'Shirt' item, 'Cashless' my_group UNION ALL
      SELECT  'Jeans', 'Cashless' UNION ALL
      SELECT  'Jeans', 'Cash' UNION ALL
      SELECT  'Cap', 'Cash' UNION ALL
      SELECT  'Shirt', 'Cash' UNION ALL
      SELECT  'Cap', 'Cashless'
    ), tuple as (  
      SELECT my_group, ARRAY_AGG(DISTINCT item) items
      FROM test_data
      group by my_group 
    )
    select my_group, item
    from tuple,
    unnest(test(items)) item    
    

    有输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      相关资源
      最近更新 更多