【问题标题】:Array Aggregation in Bigquery with Run Length Encoded ArraysBigquery 中具有运行长度编码数组的数组聚合
【发布时间】:2022-10-25 04:09:55
【问题描述】:

我有一个看起来像这样的 BigQuery 表:

--------------------------------------------------------
|  col1  | cols 2-10 |              col 11             |
--------------------------------------------------------
| event1 | metatdata | [0,0,0,0,0,0,0...1, 30, 50, 43] |
--------------------------------------------------------

最后一列是代表事件数据的 int64 数组(数组中的位置以及任何前导零都很重要)。通常 ARRAY_AGG 可以聚合最后一列中的计数(这是所有这一切的最终目标),但在我的情况下,数据实际上是运行长度编码(RLE),所以它可能看起来像这样:

[-20, 1, 4, 5, 10, 20]
[-10, 2, 4, 10, 3, 8]

其中任何负数表示零的数量。

所以 [-10, 1] 是: [0,0,0,0,0,0,0,0,0,0,1]

我试图想办法在查询时用正确长度的数组 0 替换负数,这样我就可以将它输入 ARRAY_AGG。

一个理想的解决方案将能够在查询时用适当数量的零替换数组中的任意数量的负数,以允许聚合准确计算。一个不太理想的解决方案将允许固定数量的替换(甚至 1 个)。

所以,理想: [-4, 3, -2, 1, -3, 9] -> [0,0,0,0,3,0,0,1,0,0,0,9]

到目前为止,我的尝试使用了 UNNEST 和 IF 语句,但我还没有走得太远。

感谢您的任何意见。

【问题讨论】:

    标签: google-cloud-platform google-bigquery bigtable


    【解决方案1】:

    考虑以下方法

    select 
      format('%t', col11) col11, 
      format('%t', encoded_col11) encoded_col11, 
      array(select cast(el as int64) from t.encoded_col11 as el)
    from (
      select col11, split((
        select string_agg(if(num < 0,repeat('0', -num), '' || num), '' order by offset)
        from t.col11 num with offset
      ), '') encoded_col11
      from your_table t
    ) t   
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

    • 这是解码 RLE 的一个非常好的解决方案,但我们留下了一个字符串数组,目标是按索引对这些数组值求和,例如:SELECT ARRAY_AGG(x ORDER BY idx) as output FROM ( SELECT idx, SUM(x) AS x FROM ... UNNEST(encoded_col11) AS x WITH OFFSET idx GROUP BY idx 但首先我们需要隐藏 ARRAY<STRING>到数组<INT64>。你会建议什么作为一种优雅的方式来做到这一点?
    • 这个答案准确地反映了问题中的问题:o)如果您将发布带有您最近的想法/期望的新问题,我们将很乐意提供更多帮助。同时,您能否确认您最初的问题确实得到了回答并且您得到了预期的输出?
    • 我认为唯一出乎意料的是 ARRAY<STRING> 与 ARRAY<INT64>。我同意总结部分将是一个不同的问题。
    • 顺便说一句,1)如果您需要数组与字符串 - jusr 将 string_agg 替换为 array_agg 或仅对结果字符串应用拆分)2)您也可以删除 format('%t', ...) 这只是为了以更易读的方式表示结果:o)
    • 我认为 string_agg 仍然需要引入 repeat('0') 因为 array_agg 不支持这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2014-08-19
    • 1970-01-01
    • 2021-03-24
    • 2010-11-07
    相关资源
    最近更新 更多