Извлечение значений индекса из массива в данные BiQuery JSON - PullRequest
0 голосов
/ 26 февраля 2020

Я импортировал данные из Firestore в BigQuery. Структура моих данных похожа на эту:

data = [
  {
    id: "item1",
    status: {
      options: [
        {
          title: "Approved",
          color: "#00ff00"
        },
        {
          title: "Rejected",
          color: "#ff0000"
        },
        {
          title: "Pending",
          color: "#ffaa00"
        }
      ],
      optionIndex: 0
    }
  },
  {
    id: "item2",
    status: {
      options: [
        {
          title: "Validated",
          color: "#00ff00"
        },
        {
          title: "Invalidated",
          color: "#ff0000"
        }
      ],
      optionIndex: 1
    }
  }
];

Я успешно запустил запрос для извлечения таких ключевых значений, как id:

SELECT
  JSON_EXTRACT(data, '$.id') AS item_id,
  JSON_EXTRACT(data, '$.status.optionIndex') AS option_index
FROM `my_bigquery_table`

Однако я не могу найти решение выбрать status.options [status.options.optionIndex] , где я могу получить заголовок и цвет статуса в таблице. Результат, к которому я стремился:

id,status_title,status_color
item1,Approved,#00ff00
item2,Invalidated,#ffaa00

(у меня все хорошо с большинством базовых c SQL, включая объединения, но получение массивов статуса в запрашиваемую структуру, где я могу выбрать индекс не был в моем уровне)

1 Ответ

2 голосов
/ 27 февраля 2020

Ниже для BigQuery Standard SQL

#standardSQL
CREATE TEMP FUNCTION json2array(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
  return JSON.parse(input).map(x=>JSON.stringify(x));
'''; 
SELECT 
  JSON_EXTRACT_SCALAR(data, '$.id') AS id,
  JSON_EXTRACT_SCALAR(option, '$.title') AS status_title,
  JSON_EXTRACT_SCALAR(option, '$.color') AS status_color
FROM `project.dataset.my_bigquery_table`,
UNNEST([json2array(JSON_EXTRACT(data, '$.status.options'))[OFFSET(CAST(JSON_EXTRACT_SCALAR(data, '$.status.optionIndex') AS INT64))]]) option  

Если применить к образцу данных в вашем вопросе - вывод

Row id      status_title    status_color     
1   item1   Approved        #00ff00  
2   item2   Invalidated     #ff0000  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...