由于hive查询错误导致hadoop作业出错

vks*_*vks 10 java hadoop hive amazon-emr

例外:

2017-06-21 22:47:49,993 FATAL ExecMapper (main): org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable org.apache.hadoop.dynamodb.DynamoDBItemWritable@2e17578f
    at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:643)
    at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:149)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.RuntimeException: Exception while processing record: org.apache.hadoop.dynamodb.DynamoDBItemWritable@2e17578f
    at org.apache.hadoop.hive.dynamodb.DynamoDBObjectInspector.getColumnData(DynamoDBObjectInspector.java:136)
    at org.apache.hadoop.hive.dynamodb.DynamoDBObjectInspector.getStructFieldData(DynamoDBObjectInspector.java:97)
    at org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters$StructConverter.convert(ObjectInspectorConverters.java:328)
    at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:626)
    ... 9 more
Caused by: java.lang.NumberFormatException: For input string: "17664956244983174066"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Long.parseLong(Long.java:444)
    at java.lang.Long.parseLong(Long.java:483)
    at org.apache.hadoop.hive.dynamodb.DynamoDBDataParser.getNumberObject(DynamoDBDataParser.java:179)
    at org.apache.hadoop.hive.dynamodb.type.HiveDynamoDBNumberType.getHiveData(HiveDynamoDBNumberType.java:28)
    at org.apache.hadoop.hive.dynamodb.DynamoDBObjectInspector.getColumnData(DynamoDBObjectInspector.java:128)
    ... 12 more
Run Code Online (Sandbox Code Playgroud)

我发送的配置单元查询是:

INSERT OVERWRITE TABLE temp_1 
         SELECT * FROM temp_2 
         WHERE t_id="17664956244983174066" and t_ts="636214684577250000000";
Run Code Online (Sandbox Code Playgroud)

这个数字太大而无法转换为int吗?我甚至尝试发送17664956244983174066没有引号但我得到相同的例外.

t_id在dynamobd中定义为BIGINTin hive table和Nor Number

编辑:

我尝试定义t_id为string==>Schema mismatch as dynamodb stores this as int

t_idas double== >>precision lost. no match.

这里有什么解决方案?

vks*_*vks 2

AWS专家的解决方案是

  1. git clone 开源 emr-dynamodb-connector
  2. 修改代码
  3. 准备你自己的罐子
  4. 使用 bootstrapper 将其上传到 EMR
  5. 在 run_job_flow 中,发送配置以将hadoop env您自己的 jar 位置附加到HADOOP_CLASSPATH.

由于对 Java 不太了解,修改 emr-dynamodb-connector 对我来说是不可能的,但这就是解决方案。另外还可以做两件事...如果您不在StringsDynamodb 中使用,则映射string到hiveDynamodb ,否则添加从 hive 到 Dynamodb 的number映射和支持decimalnumber