获取BigQuery中的列表/数组的所有第一元素

时间:2019-05-03 18:31:35

标签: sql google-bigquery

我有很多.csv文件,它们具有以下单元格值:

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

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

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

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

[4, .... ,  0 ]

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

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

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

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

p.s。我已经尝试解决上游问题,但无济于事。

Example csv file

1 个答案:

答案 0 :(得分:3)

不确定是否正是您要的内容,但希望下面的示例(对于BigQuery Standard 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`