使用 JsonSerDe 时找不到启动令牌错误

问题描述 投票:0回答:3

我正在尝试从 S3 导入 JSON 数据,并在进行一些查询后,再次将输出以 JSON 格式导出到 S3。但是,我在 EMR 集群上的 hive 步骤中收到 “org.apache.hadoop.hive.serde2.SerDeException:java.io.IOException:在预期位置未找到启动令牌” 错误。为了了解问题所在,我简化了 Hive 脚本和 JSON 数据,但它仍然给出相同的错误。我该如何解决这个问题?

集群配置:

发布:emr-5.3.1

蜂巢版本:2.1.1

Hadoop 发行版:Amazon 2.7.3

服务角色:EMR_DefaultRole

MasterInstanceType:m4.large

简化后的JSON数据内容:

[{"MyID":"FOO123","MyField":"FOO"},{"MyID":"BAR123","MyField":"BAR"}]

Hive 脚本:

DROP TABLE IF EXISTS SOURCE;
DROP TABLE IF EXISTS DESTINATION;

CREATE EXTERNAL TABLE SOURCE(MyID STRING, MyField STRING)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://myPath/subPath/';

CREATE EXTERNAL TABLE DESTINATION(MyID STRING, MyField STRING)                                    
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://anotherPath/subPath/';

INSERT OVERWRITE TABLE DESTINATION SELECT MyID, MyField FROM SOURCE;

这是堆栈跟踪:

顶点失败,vertexName=Map 4,vertexId=vertex_1278452616863_0001_1_00,诊断=[任务失败,taskId=task_1278452616863,诊断=[TaskAttempt 0 失败,信息=[错误:运行任务时出错(失败):attempt_1278452616863:java.lang.Run时间异常:java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:处理可写时出现Hive运行时错误[{“MyID”:“FOO123”,“MyField”:“FOO”},{“MyID” :"BAR123","MyField":"BAR"}] 在 org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:211) 在 org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:168) 在 org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:370) 在 org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:73) 在 org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:61) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698) 在 org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:61) 在 org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:37) 在 org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 引起原因:java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:处理可写时出现Hive运行时错误[{“MyID”:“FOO123”,“MyField”:“FOO”},{“ MyID":"BAR123","MyField":"BAR"}] 在 org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.processRow(MapRecordSource.java:95) 在 org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.pushRecord(MapRecordSource.java:70) 在 org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.run(MapRecordProcessor.java:383) 在 org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:185) ... 14 更多 引起原因:org.apache.hadoop.hive.ql.metadata.HiveException:处理可写 [{"MyID":"FOO123","MyField":"FOO"},{"MyID":"BAR123" 时出现 Hive 运行时错误,"MyField":"BAR"}] 在 org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:497) 在 org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.processRow(MapRecordSource.java:86) ... 17 更多 引起原因:org.apache.hadoop.hive.serde2.SerDeException:java.io.IOException:在预期位置找不到启动令牌 在 org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:183) 在 org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.readRow(MapOperator.java:128) 在 org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.access$200(MapOperator.java:92) 在 org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:488) ... 18 更多 引起原因:java.io.IOException:在预期位置未找到启动令牌 在 org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:169) ... 21 更多

谢谢。

amazon-web-services hive emr amazon-emr
3个回答
6
投票

JSON 应该以

{
开头,而不是数组 (
[
)


0
投票

{"MyID":"FOO123","MyField":"FOO"} {"MyID":"BAR123","MyField":"BAR"}

这是答案,不应该有逗号


-1
投票

我尝试用这种方法更新了我的 JSON 文件,其结构为

{"MyID":"FOO123","MyField":"FOO"},
{"MyID":"BAR123","MyField":"BAR"}

但完成后,我注意到只有第一个对象被插入到表中。

© www.soinside.com 2019 - 2024. All rights reserved.