Можно ли UNNEST для массива в BigQuery, чтобы вложенные данные были разбиты на столбцы по значению ключа? - PullRequest
0 голосов
/ 20 мая 2019

Допустим, у меня есть некоторые данные в BigQuery, которые включают в себя вложенный массив объектов, например так:

{
    "name" : "Bob",
    "age": "24",
    "customFields": [
      {
        "index": "1",
        "value": "1.98"
      },
      {
        "index": "2",
        "value": "Nintendo"
      },
      {
        "index": "3",
        "value": "Yellow"
      }
    ]
}

Мне удалось только откатить эти данные, чтобы "index" и "value"поля представляют собой столбцы:

+------+-----+-------+----------+
| name | age | index |  value   |
+------+-----+-------+----------+
| Bob  |  24 |     1 | 1.98     |
| Bob  |  24 |     2 | Nintendo |
| Bob  |  24 |     3 | Yellow   |
+------+-----+-------+----------+

В большинстве случаев это будет желаемый результат, но поскольку данные, которые я использую, относятся к пользовательским измерениям Google Analytics, мне требуется нечто более сложное.Я пытаюсь получить значение индекса для использования в названии столбца, в котором отображаются данные, например:

+------+-----+---------+----------+---------+
| name | age | index_1 | index_2  | index_3 |
+------+-----+---------+----------+---------+
| Bob  |  24 |    1.98 | Nintendo | Yellow  |
+------+-----+---------+----------+---------+

Возможно ли это?Какой запрос SQL необходим для генерации этого вывода?Он должен использовать значение «index» в имени столбца, поскольку выходные данные не будут все время находиться в упорядоченном «1,2,3, ...».

1 Ответ

1 голос
/ 20 мая 2019

То, что вы описываете, часто называют сводной таблицей - преобразованием, в котором значения используются в качестве столбцов.Как правило, SQL не поддерживает это, поскольку SQL разработан на основе концепции фиксированной схемы, в то время как сводная таблица требует динамических схем.

Однако, если у вас есть фиксированный набор столбцов индекса, вы можете эмулировать его следующим образом:

SELECT
  name,
  age,
  ARRAY(SELECT value FROM UNNEST(customFields) WHERE index="1")[SAFE_OFFSET(0)] AS index_1,
  ARRAY(SELECT value FROM UNNEST(customFields) WHERE index="2")[SAFE_OFFSET(0)] AS index_2,
  ARRAY(SELECT value FROM UNNEST(customFields) WHERE index="3")[SAFE_OFFSET(0)] AS index_3
FROM your_table;

Это определенно определяет столбцы для каждого индекса, который выбирает правильные значения из массива customFields.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...