例外情况:
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
我发送的配置单元查询是:
INSERT OVERWRITE TABLE temp_1
SELECT * FROM temp_2
WHERE t_id="17664956244983174066" and t_ts="636214684577250000000";
这个数字太大不能转换成int吗?我甚至试过发送 17664956244983174066
没有引号,但我得到同样的例外。 t_id
定义为 BIGINT
在 hive table
以及 N
或dynamobd中的数字
编辑:
我试着定义 t_id
作为 string
==>
Schema mismatch as dynamodb stores this as int t_id
作为 double
==>> precision lost. no match.
这里的解决办法是什么?
5条答案
按热度按时间svmlkihl1#
这个数字太大不能转换成int吗?
是的,这个数字太大,无法转换为整数类型。根据ApacheHive关于数字类型的文档
BIGINT
电话:9223372036854775807。你的输入,17664956244983174066,比这个大。下面是一个普通的配置单元查询(没有dynamodb集成),演示了尝试将各种输入转换为
BIGINT
.记录的最大值
BIGINT
,值转换正确。仅高出1时,转换失败,导致NULL
. 同样的事情也发生在你的输入上。该查询还演示了到
DOUBLE
是成功的。也许这是一个解决方案,取决于您的用例。与整型数据类型相比,这会带来遇到浮点精度问题的风险。从堆栈跟踪来看,dynamodb集成似乎导致
NumberFormatException
为了这个案子而不是NULL
. 这可以说是dynamodb连接器中的一个bug,但是即使它被更改为Map到NULL
,您仍然无法成功转换。qoefvg9y2#
根据https://www.tutorialspoint.com/hive/hive_data_types.htm ,十进制类型将适用于您。
hive中的decimal类型与java的big decimal格式相同。用于表示不可变的任意精度。语法和示例如下:
j2qf4p5b3#
awsMaven的解决方案是
git克隆开源emr dynamodb连接器
修改代码
准备你自己的jar
使用bootstrapper上传到emr
在运行作业流中,发送配置
hadoop env
在中附加您自己的jar位置HADOOP_CLASSPATH
.由于不太喜欢java,修改emr dynamodb连接器对我来说是不可能的,但这就是解决方案。还有两件事可以做。。。如果你不使用
Strings
在dynamodb中,Mapstring
的hive
至number
或者添加Map和对decimal
从Hive到发电机number
bwleehnv4#
你的数字超出了bigint的范围。
把两边的东西都定义为一个字符串。
ws51t4hk5#
我没用过电子病历,但我猜是这样的:)
配置单元自动尝试转换输入,因为目标字段是bigint,您是否尝试过类似的操作?
根据我的经验,这应该可以避免强制转换您的输入,但是您可能会在新表中插入异常,您可以在选择期间强制转换您的字段,如果您有太多的列,您也可以尝试此操作
https://community.hortonworks.com/questions/7703/whether-hive-supports-hive-select-all-query-with-e.html