У меня есть коллекция файлов JSON, которые я пытаюсь запросить с помощью AWS Athena / Glue.Одна запись на файл.Для начала я просмотрел файлы с помощью гусеничного сканера.Авто-схемы Glue такие же, как у меня, за исключением того, что у меня есть структуры для timeline
вместо map<string, string>
, которые у меня есть в настоящее время.
Данные timeline
мне не очень полезны, они простонужно не пропустить мои запросы.Если возможно, я бы хотел избежать написания задания ETL (как описано в этом вопрос / ответ ) для удаления / сглаживания / изменения данных timeline
, но если я должен, я должен.
Данные в JSON-файлах:
{
"id": "0093f8ee-406d-49a6-96c0-0ae43eb6a94e",
"handlerId": "323d11be7e5f720224b9935a6476ebfd",
"handlerUrn": "urn::::stack:AWS:EC2:Patching",
"contextUrn": "urn::test:aab:aws:533:us-east-1:ec2:instance/i-07",
"urn": "urn::test:aab:process:0093f8ee-406d-49a6-96c0-0ae43eb6a94e",
"timeline": {
"2019-05-17T16:55:06.715Z": "NEW",
"2019-05-17T16:55:06.862Z": "READY",
"2019-05-17T16:55:07.186Z": "WAITING",
"2019-05-17T16:55:07.895Z": "RUNNING",
"2019-05-17T17:03:09.775Z": "TERMINATED"
},
"state": "TERMINATED",
"timestamp": "2019-05-17T17:03:09.775Z"
}
Это схема, которая у меня есть прямо сейчас.
CREATE EXTERNAL TABLE IF NOT EXISTS processes00.processesmap
(id string,
handlerId string,
handlerUrn string,
contextUrn string,
urn string,
timeline map<string, string>,
state string,
`timestamp` timestamp
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION 's3://Processes/0/0/';
Я попытался обернуть уродливое имя ключа временной метки в строку вmaps<string, string>
но я не знаю, насколько это эффективно.
Простой ответ: «Не используйте метки времени в качестве имен ключей», и я хотел бы изменить это.