由于配置单元查询错误,hadoop作业中出现错误

waxmsbnn  于 2021-06-01  发布在  Hadoop
关注(0)|答案(5)|浏览(541)

例外情况:

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 定义为 BIGINThive table 以及 N 或dynamobd中的数字
编辑:
我试着定义 t_id 作为 string ==>
Schema mismatch as dynamodb stores this as int t_id 作为 double ==>> precision lost. no match. 这里的解决办法是什么?

svmlkihl

svmlkihl1#

这个数字太大不能转换成int吗?
是的,这个数字太大,无法转换为整数类型。根据ApacheHive关于数字类型的文档 BIGINT 电话:9223372036854775807。你的输入,17664956244983174066,比这个大。
下面是一个普通的配置单元查询(没有dynamodb集成),演示了尝试将各种输入转换为 BIGINT .

SELECT
    "9223372036854775807" AS str,
    cast("9223372036854775807" AS BIGINT) AS numbigint,
    cast("9223372036854775807" AS DOUBLE) AS numdouble
UNION ALL
SELECT
    "9223372036854775808" AS str,
    cast("9223372036854775808" AS BIGINT) AS numbigint,
    cast("9223372036854775808" AS DOUBLE) AS numdouble
UNION ALL
SELECT
    "17664956244983174066" AS str,
    cast("17664956244983174066" AS BIGINT) AS numbigint,
    cast("17664956244983174066" AS DOUBLE) AS numdouble
;

    str numbigint   numdouble
0   9223372036854775807 9223372036854775807 9.2233720368547758e+18
1   9223372036854775808 NULL    9.2233720368547758e+18
2   17664956244983174066    NULL    1.7664956244983173e+19

记录的最大值 BIGINT ,值转换正确。仅高出1时,转换失败,导致 NULL . 同样的事情也发生在你的输入上。
该查询还演示了到 DOUBLE 是成功的。也许这是一个解决方案,取决于您的用例。与整型数据类型相比,这会带来遇到浮点精度问题的风险。
从堆栈跟踪来看,dynamodb集成似乎导致 NumberFormatException 为了这个案子而不是 NULL . 这可以说是dynamodb连接器中的一个bug,但是即使它被更改为Map到 NULL ,您仍然无法成功转换。

qoefvg9y

qoefvg9y2#

根据https://www.tutorialspoint.com/hive/hive_data_types.htm ,十进制类型将适用于您。
hive中的decimal类型与java的big decimal格式相同。用于表示不可变的任意精度。语法和示例如下:

DECIMAL(precision, scale)
decimal(10,0)
j2qf4p5b

j2qf4p5b3#

awsMaven的解决方案是
git克隆开源emr dynamodb连接器
修改代码
准备你自己的jar
使用bootstrapper上传到emr
在运行作业流中,发送配置 hadoop env 在中附加您自己的jar位置 HADOOP_CLASSPATH .
由于不太喜欢java,修改emr dynamodb连接器对我来说是不可能的,但这就是解决方案。还有两件事可以做。。。如果你不使用 Strings 在dynamodb中,Map stringhivenumber 或者添加Map和对 decimal 从Hive到发电机 number

bwleehnv

bwleehnv4#

你的数字超出了bigint的范围。
把两边的东西都定义为一个字符串。

ws51t4hk

ws51t4hk5#

我没用过电子病历,但我猜是这样的:)
配置单元自动尝试转换输入,因为目标字段是bigint,您是否尝试过类似的操作?

INSERT OVERWRITE TABLE temp_1 
SELECT * FROM temp_2 
WHERE cast(t_id as string)="17664956244983174066" and cast(t_ts as string)="636214684577250000000";

根据我的经验,这应该可以避免强制转换您的输入,但是您可能会在新表中插入异常,您可以在选择期间强制转换您的字段,如果您有太多的列,您也可以尝试此操作
https://community.hortonworks.com/questions/7703/whether-hive-supports-hive-select-all-query-with-e.html

相关问题