Ожидаемый BEGIN_OBJECT, но в Hive произошла ошибка STRING - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь использовать AWS Data Pipeline для экспорта некоторых файлов jsonl из S3 в DynamoDB. Мы используем сценарии Hive для этого.

Сами данные выглядят следующим образом:

{"property":{"type":"retail","code":"A"},"comments":{"country":"UK","city":"Bristol"},"id":"7659403"}

Сценарий My Hive имеет следующий вид:

ADD JAR s3://bucket/json-serde-1.3.8-jar-with-dependencies.jar;
DROP TABLE IF EXISTS json_export_ddb;
CREATE EXTERNAL TABLE json_export_ddb (
                      property map<string,string>,
                      comments map<string,string>,
                      id string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ( 'paths'='property, comments, id' ) 
STORED AS TEXTFILE
LOCATION 's3:/bucket/subdirectory';

DROP TABLE IF EXISTS json_hive;
CREATE EXTERNAL TABLE json_hive (
                      property map<string,string>,
                      comments map<string,string>,
                      id string)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 

TBLPROPERTIES (
                   "dynamodb.table.name" = "dynamoTableName",
                   "dynamodb.column.mapping" = "property:property,comments:comments,id:id");

INSERT OVERWRITE TABLE json_hive SELECT * FROM json_export_ddb;

Этот сценарий выполняется нормально, если данные типы являются примитивными (string, double и c). Но в этом случае есть 2 карты, и у меня возникают проблемы с выполнением одного и того же скрипта.

Я получаю ошибку:

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"property":{"type":"retail","code":"A"},"comments":{"country":"UK","city":"London"},"id":"7659403"}

Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1

Я застрял с эта ошибка целый день и до сих пор не могу понять, что я делаю не так. Сама ошибка довольно ясна, она ожидает объект JSON, но вместо этого получает строку. Дело в том, где находится строка? Кажется, что JSON начинается с { (как видно из журналов ошибок).

Я посмотрел другие подобные посты, но они используют Gson напрямую, тогда как в данном случае это внешняя служба, импортирующая gson, поэтому я не уверен, что мне нужно делать.

Спасибо.

...