我正在寻找一种一致的方法来散列hive查询语言和impala查询语言中的内容,其中散列函数产生相同的值,而不管它是在hive还是在impala中完成的。澄清一下,我想要 some_hive_hash_thing(A) = some_other_impala_hash_thing(A)
.
对于Hive,我知道有 hash()
它使用md5(或者这里的任何命令)。对于 Impala ,我知道有 fnv_hash()
它使用fnv算法。我知道hive和impala有自己的哈希函数,但它们完全不同。
理想情况下,我正在寻找一种方法 fnv_hash
在Hive里,或者在 Impala 里做md5的方法。有人有什么建议吗?
1条答案
按热度按时间qcuzuvrc1#
现在作为答案已经太迟了,但是让我们把它放在这里,让其他可能觉得有用的人看看。
“在impala中实现md5的方法”是的,在最近的版本中,您可以使用impala中hive的UDF内置功能(我使用的是CDH5.12,它在Impala2.9和Hive1.1中运行良好)
您可以在这里找到内置函数的列表https://cwiki.apache.org/confluence/display/hive/languagemanual+udf
或者你可以直接跑
SHOW FUNCTIONS;
在你的Hive控制台里beeline -u jdbc:hive2://localhost:10000
让我们模拟一下如何将md5函数从hive添加到impala。为了确保函数存在并知道输入和输出变量的类型,这里我们知道md5(string)将字符串作为变量,将字符串作为返回类型。
接下来,我们需要使用jar命令找到包含md5类的hive exec jar:
如果尚未在环境变量中配置jar命令,则它通常位于java存储库下的/bin中。
您可以在../lib/hive/lib/中找到hive-exec-x-x.jar文件,如果找不到,只需使用locate命令
所以输出是这样的:
请稍后保存该路径,但我们将用“.”替换“/”,并删除“.class”,如下所示:org.apache.hadoop.hive.ql.udf.udfmd5
将jar文件复制到hdfs可以访问的目录中,您可以将其重命名为一个简单的用法“im gonna name it hive exec.jar”。
然后在hdfs中创建一个放置jar的地方
使用以下方法将jar文件复制到hdfs:
所以现在您只需转到impala shell并连接到数据库,然后使用jar的hdfs路径和我们之前同意在symbol中转换的.class路径来创建函数。
现在,您可以像使用任何impala函数一样使用它: