unnest () не взрывает массив, возвращает ошибку Список псевдонимов столбцов содержит 1 запись, но в 't' есть 2 доступных столбца - PullRequest
1 голос
/ 12 июня 2019

У меня есть некоторые данные json, которые содержат свойство 'характеры', и оно выглядит так:

select json_data['characters'] from latest_snapshot_events

Возвращает: [{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":60,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":10,"shards":0,"CHAR_TPIECES":0,"CHAR_A5_LVL":0,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":3},{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":50,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":39,"shards":0,"CHAR_TPIECES":0,"CHAR_A5_LVL":0,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":2},{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":80,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":6801450488388220,"shards":0,"CHAR_TPIECES":0,"CHAR_A5_LVL":1,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":4},{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":85,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":8355588830097610,"shards":0,"CHAR_TPIECES":5,"CHAR_A5_LVL":0,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":4}]

Это возвращается в одной строке.Мне нужна отдельная строка для каждого элемента в массиве.

Я обнаружил несколько SO-сообщений и других блогов, рекомендующих использовать unnest().Я пробовал это несколько раз и не могу получить результат, чтобы вернуться.Например, вот документация от presto .Нижняя крышка снимается как подставка для бокового обзора улья:

SELECT student, score
FROM tests
CROSS JOIN UNNEST(scores) AS t (score);

Поэтому я попытался применить это к моей таблице:

characters as (
select
  jdata.characters
from latest_snapshot_events
cross join unnest(json_data) as t(jdata)
)
select * from characters;

, где json_data - поле вlatest_snapshot_events, который содержит свойство 'characters', представляющее собой массив, подобный показанному выше.

Возвращает ошибку:

[Simba] AthenaJDBC Ошибка была выданаКлиент AWS Athena.SYNTAX_ERROR: строка 69:12: в списке псевдонимов столбцов есть 1 запись, но в 't' есть 2 доступных столбца

Как можно развернуть / разбить latest_snapshot_events.json_data['characters'] на несколько строк?

1 Ответ

4 голосов
/ 12 июня 2019

Поскольку characters является массивом JSON в текстовом представлении, вам необходимо:

  1. Синтаксически проанализировать текст JSON с помощью json_parse, чтобы получить значение типа JSON .
  2. Преобразовать значение JSON в массив SQL с помощью CAST.
  3. Разобрать массив с помощью UNNEST.

Например:

WITH data(characters) AS (
    VALUES '[{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":60,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":10,"shards":0,"CHAR_TPIECES":0,"CHAR_A5_LVL":0,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":3},{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":50,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":39,"shards":0,"CHAR_TPIECES":0,"CHAR_A5_LVL":0,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":2},{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":80,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":6801450488388220,"shards":0,"CHAR_TPIECES":0,"CHAR_A5_LVL":1,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":4},{"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":85,"CHAR_A3_LVL":1,"CHAR_TIER":1,"ITEM":8355588830097610,"shards":0,"CHAR_TPIECES":5,"CHAR_A5_LVL":0,"CHAR_A2_LVL":1,"CHAR_A4_LVL":1,"ITEM_CATEGORY":"Character","ITEM_LEVEL":4}]'
)
SELECT entry
FROM data, UNNEST(CAST(json_parse(characters) AS array(json))) t(entry)

, что дает:

                               entry
-----------------------------------------------------------------------
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":60,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":50,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":80,"CHAR_A3_LVL":1,...
 {"CHAR_STARS":1,"CHAR_A1_LVL":1,"ITEM_POWER":85,"CHAR_A3_LVL":1,...

В приведенном выше примере я конвертирую значение JSON в array(json), но вы можете преобразовать его в нечто более конкретное, если значения внутри каждой записи массива имеют регулярную схему.Например, для ваших данных можно привести их к array(map(varchar, json)), поскольку каждый элемент в массиве является объектом JSON.

...