【问题标题】:Get all first elements of list/array in BigQuery在 BigQuery 中获取列表/数组的所有第一个元素
【发布时间】:2019-05-04 02:59:38
【问题描述】:

我有大量具有以下单元格值的 .csv 文件:

"[[0.0, 4.0],  .... , [240.0, 0.0], [248.0, 0.0]]"

该字符串包含一个嵌套列表,是直方图缩减器的结果,它具有 32 个用于 8 位数据的 bin,并包含较低的 bin 值和计数。

例如,第一个元素包含第一个 bin 的较低 bin 值 (0.0) 和计数 (4.0)。最后一个元素包含第 32 个 bin (248.0) 和 count (0.0) 的较低 bin 值。

由于较低的 bin 值不会改变并且已知 [0,8,16 ... 248],因此我只想提取计数,即

[4, .... ,  0 ]

在 Python 中,这很简单,但是数据量很大,我有 3,422,250 个这些直方图。因此,我考虑使用 Google BigQuery 来完成工作。

当我在 BigQuery 中加载 cvs 数据时,直方图存储为 STRING 类型。

如何在 BigQuery 的 ARRAY 数据类型中获取以字符串形式存储在 csv 中的嵌套列表(数组)?在documentation 中,它表示尚不支持嵌套数组。有解决办法吗?

也非常欢迎有关如何获取多个数组的第一个元素的指导!

附言我已经尝试在上游解决问题,但无济于事。

Example csv file

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    不确定这是否正是您所要求的,但希望下面的示例(针对 BigQuery 标准 SQL)对您有所帮助

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT 1 id,'[[0.0, 4.0], [8.0, 0.0], [16.0, 0.0], [24.0, 0.0], [32.0, 0.0], [40.0, 0.0], [48.0, 0.0], [56.0, 0.0], [64.0, 1.0], [72.0, 1.0], [80.0, 4.0], [88.0, 0.0], [96.0, 0.0], [104.0, 0.0], [112.0, 0.0], [120.0, 0.0], [128.0, 0.0], [136.0, 0.0], [144.0, 0.0], [152.0, 0.0], [160.0, 0.0], [168.0, 0.0], [176.0, 0.0], [184.0, 0.0], [192.0, 0.0], [200.0, 0.0], [208.0, 0.0], [216.0, 0.0], [224.0, 0.0], [232.0, 0.0], [240.0, 0.0], [248.0, 0.0]]' histogram UNION ALL
      SELECT 2, '[[0.0, 0.0], [8.0, 0.0], [16.0, 0.0], [24.0, 0.0], [32.0, 0.0], [40.0, 0.0], [48.0, 0.0], [56.0, 0.0], [64.0, 0.0], [72.0, 0.0], [80.0, 0.0], [88.0, 0.0], [96.0, 0.0], [104.0, 0.0], [112.0, 1.0], [120.0, 0.0], [128.0, 1.0], [136.0, 0.0], [144.0, 0.0], [152.0, 0.0], [160.0, 0.0], [168.0, 0.0], [176.0, 0.0], [184.0, 0.0], [192.0, 0.0], [200.0, 0.0], [208.0, 0.0], [216.0, 0.0], [224.0, 0.0], [232.0, 0.0], [240.0, 0.0], [248.0, 0.0]]'
    )
    SELECT id, 
      SPLIT(bin)[OFFSET(0)] value,
      SPLIT(bin)[OFFSET(1)] frequency
    FROM `project.dataset.table`, UNNEST(SPLIT(REGEXP_REPLACE(histogram, r'\[\[|]]|\s', ''), '],[')) bin    
    

    注意:这里假设 When I load the cvs data in BigQuery, the histograms are stored as type STRING

    "[[0.0, 4.0],  .... , [240.0, 0.0], [248.0, 0.0]]"     
    

    或者-如果您想保持行完整并将直方图显示为要转换为数组的字符串-您可以在下面尝试

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT 1 id,'[[0.0, 4.0], [8.0, 0.0], [16.0, 0.0], [24.0, 0.0], [32.0, 0.0], [40.0, 0.0], [48.0, 0.0], [56.0, 0.0], [64.0, 1.0], [72.0, 1.0], [80.0, 4.0], [88.0, 0.0], [96.0, 0.0], [104.0, 0.0], [112.0, 0.0], [120.0, 0.0], [128.0, 0.0], [136.0, 0.0], [144.0, 0.0], [152.0, 0.0], [160.0, 0.0], [168.0, 0.0], [176.0, 0.0], [184.0, 0.0], [192.0, 0.0], [200.0, 0.0], [208.0, 0.0], [216.0, 0.0], [224.0, 0.0], [232.0, 0.0], [240.0, 0.0], [248.0, 0.0]]' histogram UNION ALL
      SELECT 2, '[[0.0, 0.0], [8.0, 0.0], [16.0, 0.0], [24.0, 0.0], [32.0, 0.0], [40.0, 0.0], [48.0, 0.0], [56.0, 0.0], [64.0, 0.0], [72.0, 0.0], [80.0, 0.0], [88.0, 0.0], [96.0, 0.0], [104.0, 0.0], [112.0, 1.0], [120.0, 0.0], [128.0, 1.0], [136.0, 0.0], [144.0, 0.0], [152.0, 0.0], [160.0, 0.0], [168.0, 0.0], [176.0, 0.0], [184.0, 0.0], [192.0, 0.0], [200.0, 0.0], [208.0, 0.0], [216.0, 0.0], [224.0, 0.0], [232.0, 0.0], [240.0, 0.0], [248.0, 0.0]]'
    )
    SELECT id, 
      ARRAY(
        SELECT AS STRUCT
          SPLIT(bin)[OFFSET(0)] value,
          SPLIT(bin)[OFFSET(1)] frequency
        FROM UNNEST(SPLIT(REGEXP_REPLACE(histogram, r'\[\[|]]|\s', ''), '],[')) bin
      ) histogram_as_array
    FROM `project.dataset.table`
    

    【讨论】:

    • 第二个解决方案是我的目标。太感谢了。不像我希望的那样直截了当。
    • 来自 Python 背景,我对返回列表列表的 json.loads(string) 之类的东西有点宠坏了。刚刚接受了答案。
    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2019-05-20
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多