Пользовательские классификаторы клеев AWS Json Path - PullRequest
0 голосов
/ 29 августа 2018

У меня есть набор файлов данных Json, которые выглядят следующим образом

[
  {"client":"toys",
   "filename":"toy1.csv",
   "file_row_number":1,
   "secondary_db_index":"4050",
   "processed_timestamp":1535004075,
   "processed_datetime":"2018-08-23T06:01:15+0000",
   "entity_id":"4050",
   "entity_name":"4050",
   "is_emailable":false,
   "is_txtable":false,
   "is_loadable":false}
]

Я создал гусеничный сканер со следующим пользовательским классификатором Json Path

$[*]

Клей возвращает правильную схему с правильно определенными столбцами.

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

Как я могу получить данные для распределения по их столбцам?

изображение запроса Афины

Спасибо!

1 Ответ

0 голосов
/ 29 августа 2018

Это проблема, связанная с Hive. Я предлагаю два подхода. Во-первых, вы можете создать новую таблицу в Афине со структурным типом данных следующим образом:

CREATE EXTERNAL TABLE `example`(
`row` struct<client:string,filename:string,file_row_number:int,secondary_db_index:string,processed_timestamp:int,processed_datetime:string,entity_id:string,entity_name:string,is_emailable:boolean,is_txtable:boolean,is_loadable:boolean> COMMENT 'from deserializer')
ROW FORMAT SERDE 
'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://example'
TBLPROPERTIES (
'CrawlerSchemaDeserializerVersion'='1.0', 
'CrawlerSchemaSerializerVersion'='1.0', 
'UPDATED_BY_CRAWLER'='example', 
'averageRecordSize'='271', 
'classification'='json', 
'compressionType'='none', 
'jsonPath'='$[*]', 
'objectCount'='1', 
'recordCount'='1', 
'sizeKey'='271', 
'transient_lastDdlTime'='1535533583', 
'typeOfData'='file')

И тогда вы можете выполнить запрос следующим образом:

SELECT row.client, row.filename, row.file_row_number FROM "example"

Во-вторых, вы можете переделать свой json-файл, как показано ниже, и снова запустить Crawler. В этом примере я использовал формат Single-JSON-Record-Per-Line.

{"client":"toys","filename":"toy1.csv","file_row_number":1,"secondary_db_index":"4050","processed_timestamp":1535004075,"processed_datetime":"2018-08-23T06:01:15+0000","entity_id":"4050","entity_name":"4050","is_emailable":false,"is_txtable":false,"is_loadable":false},
{"client":"toys2","filename":"toy2.csv","file_row_number":1,"secondary_db_index":"4050","processed_timestamp":1535004075,"processed_datetime":"2018-08-23T06:01:15+0000","entity_id":"4050","entity_name":"4050","is_emailable":false,"is_txtable":false,"is_loadable":false}
...