Java 为什么此配置单元QL表达式失败?

Java 为什么此配置单元QL表达式失败?,java,hadoop,hex,string-formatting,endianness,Java,Hadoop,Hex,String Formatting,Endianness,此查询失败,出现神秘的计算错误: 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.l

此查询失败,出现神秘的计算错误:

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))
我试图实现的是一致地重现Murruld3哈希十六进制值的Java实现,它使用hasher-getBytes方法,该方法以大端格式返回它们,十进制数字以小端格式写入,因此字节交换为整数

单独完成查询的每个部分都非常有效,它混合了printf和reflect what fails。。。而且只有当格式为数字类型时,才有效:

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,因此如果有解决方法,我希望保持这种方式。

Hive基本上是一个Java程序,它将类似SQL的数据类型和表达式转换为Java数据类型和Java/Hadoop表达式/作业。在大多数情况下,它已经足够复杂了。但是,如果您在混合中加入一个自定义Java表达式——这就是全部内容——那么您很可能会陷入边缘情况

在您的特定问题中,static应该返回一个基元类型int值。但我不确定Hive如何在内部处理通用整数值——可能是长时间的?可能使用自定义对象类型?? 无论如何,返回值似乎不能作为数字类型直接输入到配置单元printf函数中。默认情况下,int可能转换为字符串。。。也许它可以用很长的时间来代替

我认为有两种可能的解决办法:

将调用包装到子查询中进行反射,以便配置单元隐式转换为编译时合并的配置单元支持的类型子查询,无需额外的MR步骤-配置单元类型仍然是Stringselect printf%d,WTF from select reflect。。。。。作为WTF从。。。嗯 需要显式转换为您选择的配置单元数字类型选择printf%d,castreflect。。。。。。。作为int从。。。
我可以在它上面做算术,这两者之间可能有很大的差距,因为JVM在goofy对象包装器上做了一些魔术,而且它是printf可以直接处理的基本数字类型。在将它输入printf之前,您是否尝试将这个邪恶的Integer对象转换成一个老式的IEEE Integer a.k.a.int?确切地说,我是说SQL语法将expr转换为intoh垃圾,这很有效!如果您将该评论作为回答,我可以接受: