Создайте столбец JSON в BigQuery с фактическими значениями столбца в качестве ключей - PullRequest
1 голос
/ 30 марта 2020

Есть ли способ создать JSON в BigQuery со значениями столбцов в качестве ключей?

У меня есть 3 столбца в таблице:

user_id (string) | category (string) | info (struct)

user_1, cat_A, info_1A
user_1, cat_B, info_1B
user_1, cat_C, info_1C
user_2, cat_A, info_2A
user_3, cat_Z, info_3Z
user_3, cat_B, info_3B

To abbreviate the values of the "info" column,
let's say that it is a struct of i.e. {'f': 2, 'c': 3, ...}

Я хотел бы получить этот вывод, где keys столбца «features» являются фактическими значениями столбца «category»:

user_id (string) | features (struct/JSON)
user_1, {cat_A: info_1A, cat_B: info_1B, cat_C: info_1C, ...}
user_2, {cat_A: info_2A}
user_3, {cat_Z: info_3Z, cat_B: info_3B}

Но вместо этого я в настоящее время только для достижения этого формата (я сделал вывод JSON -форматированный для большей ясности), где ключи - это предварительно определенное имя, которое вы даете при создании STRUCT с помощью, например, STRUCT(...) AS *key*:

[
  {
    "user_id": "user_1",
    "features": [
      {
        "category": "cat_A",
        "features": {
          "f": 2,
          "c": 3,
        }
      },
      {
        "category": "cat_B",
        "features": {
          "x": 7,
          "z": 10,
        }
      },
      ...
  }
  ...
]

Используя запрос ниже:

SELECT
  user_id,
  ARRAY_AGG(
    STRUCT(
      category,
      STRUCT(f, c, x, z) AS features -- the different features for each category
    )
  )
FROM ...
GROUP BY user_id

1 Ответ

1 голос
/ 30 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT user_id, '{' || STRING_AGG(category || ': ' || info, ', ') || '}' features
FROM `project.dataset.table`
GROUP BY user_id   

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'user_1' user_id, 'cat_A' category, 'info_1A' info UNION ALL
  SELECT 'user_1', 'cat_B', 'info_1B' UNION ALL
  SELECT 'user_1', 'cat_C', 'info_1C' UNION ALL
  SELECT 'user_2', 'cat_A', 'info_2A' UNION ALL
  SELECT 'user_3', 'cat_Z', 'info_3Z' UNION ALL
  SELECT 'user_3', 'cat_B', 'info_3B' 
)
SELECT user_id, '{' || STRING_AGG(category || ': ' || info, ', ') || '}' features
FROM `project.dataset.table`
GROUP BY user_id

с выводом

Row user_id features     
1   user_1  {cat_A: info_1A, cat_B: info_1B, cat_C: info_1C}     
2   user_2  {cat_A: info_2A}     
3   user_3  {cat_Z: info_3Z, cat_B: info_3B}     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...