Разделение данных json на отдельные строки приводит к Bigquery - PullRequest
0 голосов
/ 26 февраля 2020

Я пишу код BigQuery, чтобы разделить набор данных JSON на более структурированную таблицу.

JSON_data_set выглядит примерно так

Row | createdon | result
1   | 24022020  | {"searchResult": {"searchAccounts": [{"chainName": "xyxvjw", "address": {"name": "xyxvjw - ythji", "combined_city": "uptown", "combined_address": "1 downtown, uptown, 09728", "city": "uptown"}, "products": ["pin", "needle", "cloth"]}},{"chainName": "pwiewhds", "address": {"name": "pwiewhds - oujsus", "combined_city": "over the river", "combined_address": "100 under bridge, over the river, 19920", "city": "over the river"}, "products": ["tape", "stapler"]}}],"searchID": "3abci832832o0"}}
2   | 25020202  | {"searchResult": {"searchAccounts": [{"chainName": "xyxvjw2029", "address": {"name": "xyxvjw2029 - ythji", "combined_city": "uptown", "combined_address": "1 downtown, uptown, 09728", "city": "uptown"}, "products": ["pin", "needle", "cloth"]}},{"chainName": "pwiewhds8972", "address": {"name": "pwiewhds8972 - oujsus", "combined_city": "over the river", "combined_address": "100 under bridge, over the river, 19920", "city": "over the river"}, "products": ["tape", "stapler"]}}],"searchID": "3abci832832o0"}}

Есть много последующих подробностей учетной записи в каждой строке в столбце результата. Возможность разложить данные, используя приведенный ниже код, чтобы получить данные столбца, такие как имя и адрес цепочки. Однако, когда я пытаюсь вызвать столбцы разбитых полей, выдается ошибка Невозможно получить доступ к полю _field_1 для значения с типом ARRAY-STRUCT-STRING, STRING >>

Как можно Я разделяю столбцы, созданные из данных json, на отдельные столбцы и строки, не привязываясь к столбцу строки json?

CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
   if (json !== null) {
    return JSON.parse(json).map(x=>JSON.stringify(x));
   }
"""; 

SELECT * EXCEPT(chains),
  ARRAY(SELECT AS STRUCT JSON_EXTRACT_SCALAR(x, '$.chainName'), JSON_EXTRACT_SCALAR(x, '$.address.combined_address') FROM UNNEST(chains) x WHERE JSON_EXTRACT_SCALAR(x, '$.chainName') IS NOT NULL) chain_names
FROM (
  SELECT *,
     json2array(
      JSON_EXTRACT(result, '$.searchResult.searchAccounts')
     ) chains
  FROM json_data_set
)

1 Ответ

1 голос
/ 26 февраля 2020

Просто нужно написать запрос другим способом для достижения отдельных столбцов

CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
   if (json !== null) {
    return JSON.parse(json).map(x=>JSON.stringify(x));
   }
"""; 

WITH chain_name AS (
  SELECT 
     *,
     json2array(
      JSON_EXTRACT(result, '$.searchResult.searchMerchants')
     ) chains
  FROM json_data_set
)
SELECT AS STRUCT 
   JSON_EXTRACT_SCALAR(x, '$.chainName') chainName, 
   JSON_EXTRACT_SCALAR(x, '$.address.combined_address') combined_address
FROM chain_name, UNNEST(chains) x
WHERE JSON_EXTRACT_SCALAR(x, '$.chainName') IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...