2017-02-03 5 views
8

У меня есть несколько json-файлов, хранящихся в ведре S3, где каждый файл имеет несколько элементов одинаковой структуры. Например,Хранить несколько элементов в json-файлах в AWS Athena

[{"eventId":"1","eventName":"INSERT","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"New item!","Id":101}},{"eventId":"2","eventName":"MODIFY","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"This item has changed","Id":101}},{"eventId":"3","eventName":"REMOVE","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"This item has changed","Id":101}}] 

Я хочу создать таблицу в Афине, соответствующую вышеуказанным данным.

Запрос я написал для создания таблицы:

CREATE EXTERNAL TABLE IF NOT EXISTS sampledb.elb_logs2 (
    `eventId` string, 
    `eventName` string, 
    `eventVersion` string, 
    `eventSource` string, 
    `awsRegion` string, 
    `image` map<string,string> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1', 
    'field.delim' = ' ' 
) LOCATION 's3://<bucketname>/'; 

Но если я делаю SELECT, следующий запрос,

SELECT * FROM sampledb.elb_logs4; 

я получаю следующий результат:

1 {"eventid":"1","eventversion":"1.0","image":{"id":"101","message":"New item!"},"eventsource":"aws:dynamodb","eventname":"INSERT","awsregion":"us-west-2"} {"eventid":"2","eventversion":"1.0","image":{"id":"101","message":"This item has changed"},"eventsource":"aws:dynamodb","eventname":"MODIFY","awsregion":"us-west-2"} {"eventid":"3","eventversion":"1.0","image":{"id":"101","message":"This item has changed"},"eventsource":"aws:dynamodb","eventname":"REMOVE","awsregion":"us-west-2"} 

Все содержимое json-файла выбрано в виде одной записи здесь.

Как я могу прочитать каждый элемент json-файла в виде одной записи?

Редактировать: Как я могу прочитать каждую подколонку изображения, т. Е. Каждый элемент карты?

Спасибо.

ответ

9

Question1: хранить несколько элементов в JSon файлов для AWS Афина

мне нужно переписать мой файл JSON в качестве

{ "EVENTID": "1", "именем_события": "INSERT", «eventVersion»: «1.0», «eventSource»: «aws: dynamodb», «awsRegion»: «us-west-2», «image»: {«Message»: «Новый элемент!», «Id»: 101 }}, {«eventId»: «2», «eventName»: «MODIFY», «eventVersion»: «1.0», «eventSource»: «aws: dynamodb», «awsRegion»: «us-west-2», «image»: {«Сообщение»: «Этот элемент изменен», «Id»: 101}}, {«eventId»: «3», «eventName»: «REMOVE», «eventVersion»: «1.0», eventSource ":" aws: dynamodb "," awsRegion ":" us-west-2 "," image ": {" Message ":" Этот элемент изменен "," Id ": 101} }

Это означает, что

Удалить квадратные скобки [] Keep каждый элемент в одной строке

{.....................} 
{.....................} 
{.....................} 

Вопрос2. нелинейный доступ JSON атрибуты

CREATE EXTERNAL TABLE IF NOT EXISTS <tablename> (
    `eventId` string, 
    `eventName` string, 
    `eventVersion` string, 
    `eventSource` string, 
    `awsRegion` string, 
    `image` struct <`Id` : string, 
        `Message` : string> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1', 
    "dots.in.keys" = "true" 
) LOCATION 's3://exampletablewithstream-us-west-2/'; 

Запрос:

select image.Id, image.message from <tablename>; 

Ref:

http://engineering.skybettingandgaming.com/2015/01/20/parsing-json-in-hive/

https://github.com/rcongiu/Hive-JSON-Serde#mapping-hive-keywords

+0

У меня такая же проблема, как Q1, как мои данные поступают из sendgrid и У меня нет большого выбора в отношении формата данных :( – CpILL

Смежные вопросы