Получить все первые элементы списка / массива в BigQuery - PullRequest
1 голос
/ 03 мая 2019

У меня есть большое количество файлов .csv со следующими значениями ячеек:

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

Строка содержит вложенный список и является результатом редуктора гистограммы с 32 ячейками для 8-битных данных и содержитнижнее значение бина и количество.

Например, первый элемент содержит значение нижнего бина 1-го бина (0.0) и счетчика (4.0).Последний элемент содержит значение нижнего бина 32-го бина (248,0) и счетчика (0,0).

Поскольку нижние значения бина не меняются и известны [0,8,16 ... 248], я бы хотел извлечь только счетчики, т.е.

[4, .... ,  0 ]

В Python,это было бы просто, однако объем данных довольно большой, и у меня есть 3422,250 из этих гистограмм.Поэтому я решил использовать Google BigQuery, чтобы выполнить работу.

Когда я загружаю данные cvs в BigQuery, гистограммы сохраняются как тип STRING.

Как получить вложенные списки (массивы), которые хранятся в виде строки в csv, в типе ARRAY в BigQuery?В документации говорится, что вложенные массивы еще не поддерживаются.Есть ли обходные пути?

руководство по получению первого элемента из нескольких массивов тоже очень приветствуется!

ps Я уже пытался решить проблему в апстриме безрезультатно.

Пример CSV-файла

1 Ответ

3 голосов
/ 03 мая 2019

Не уверен, что это именно то, что вы спрашиваете, но надеюсь, что приведенный ниже пример (для 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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...