Структура многомерного массива AWS Athena JSON

Файл JSON имеет такую ​​структуру:

"otherstuff" : "stuff",
"ArrayofArrays" : {
   "Array-1" : {
      "type" : "sometype",
      "is_enabled" : false,
      "is_active" : false,
      "version" : "version 1.1"
   },
   "Array-2" : {
      "type" : "sometype",
      "is_enabled" : false,
      "is_active" : false,
      "version" : "version 1.2"
   }
   ...
}

Запрос выполняется, когда со следующим

CREATE EXTERNAL TABLE IF NOT EXISTS test2.table14 (
`otherstuff` string,
`ArrayofArrays` array<array<struct<version:string>>>
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
     'serialization.format' = '1' ) LOCATION 's3://bucket/folder/' TBLPROPERTIES ('has_encrypted_data'='false')

Однако, когда я запускаю основной запрос к таблице предварительного просмотра, я получаю следующую ошибку.

HIVE_BAD_DATA: Ошибка разбора значения поля для поля #: org.openx.data.jsonserde.json.JSONObject не может быть приведена к org.openx.data.jsonserde.json.JSONArray

Существует явно проблема с массивом массива. Я не могу понять, какой должна быть структура. Знаете ли вы, как объявить многомерный массив для этой структуры?

1 ответ

Решение

Ваш JSON не содержит никаких элементов массива. Таким образом, вместо массива, вы должны использовать тип столбца карты, чтобы получить доступ к этой структуре.

CREATE EXTERNAL TABLE test14 (
  otherstuff string,
  ArrayofArrays map<string,struct<
     is_enabled:boolean,
     is_active:boolean,
     type:string,
     version:string
  >>
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('serialization.format' = '1' ) 
LOCATION 's3://bucket/'

Вы можете получить доступ к карте через следующий синтаксис запроса:

select t.ArrayofArrays['array-1'] from test14 t
Другие вопросы по тегам