【发布时间】:2016-05-04 18:00:59
【问题描述】:
此查询因神秘的评估错误而失败:
select printf("%08x", reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
(这里是例外)
Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating printf('%08x', reflect('java.lang.Integer','reverseBytes',1))
我想要完成的是一致地重现 murmur3 哈希十六进制值的 Java 实现,它使用 hasher getBytes 方法,以大端格式返回它们(并且十进制数字以小端写入) ,因此整数中的字节交换。
单独执行查询的每个部分都可以完美地工作,它将 printf 和反映失败的内容混合在一起......并且只有当格式是数字类型时,才有效:
select printf("%s", reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
但这也失败了
select printf("%d", reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
并且我已经确保结果是数字类型而不是字符串,因为我可以对其进行算术运算,例如:
select printf("%s", 10 * reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
到目前为止,我不需要添加任何自定义 UDF,因此如果有解决方法,我希望保持这种方式。
【问题讨论】:
-
“我可以对其进行算术运算,因为 JVM 在愚蠢的对象包装器上做了一些魔法” 和 “它是一个基础
printf可以直接处理的数字类型”。您是否尝试将cast()那个邪恶的Integer对象转换为老式 IEEE 整数(又名int),然后再将其提供给printf()? -
准确的说是SQL语法
cast(expras int) -
哦,废话,这行得通!如果您写该评论作为答案,我可以接受:)
标签: java hadoop hex string-formatting endianness