我正在寻找一种一致的方式来对Hive查询语言和Impala查询语言中的某些内容进行哈希处理,无论该哈希函数是在Hive中还是在Impala中完成,哈希函数都会产生相同的值。为了澄清,我想要类似some_hive_hash_thing(A) = some_other_impala_hash_thing(A)
的东西。
对于Hive,我知道有hash()
使用MD5(或任何命令here)。
对于Impala,我知道有fnv_hash()
使用FNV算法。我知道Hive和Impala具有自己的哈希函数,但它们彼此完全不同。
理想情况下,我正在寻找在Hive中执行fnv_hash
的方法或在Impala中执行MD5的方法。有人有建议吗?
答案 0 :(得分:1)
这是很晚的答案,但让我们将其保留在这里,以供其他可能认为有帮助的人使用。
“在Impala中执行MD5的一种方式”是的,您可以在最新版本中使用Hive在Impala中的Hive内置功能(我正在使用CDH 5.12,并且它与Impala 2.9和hive 1.1一起正常工作)
您可以在此处找到内置功能的列表 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
或者您可以简单地运行
SHOW FUNCTIONS;
在您的蜂巢控制台中
beeline -u jdbc:hive2://localhost:10000
因此,让我们模拟一下将蜂巢中的MD5功能添加到Impala。
DESCRIBE FUNCTION md5;
要确保函数存在并知道输入和输出变量的类型,因此在这里我们知道md5(string)将字符串作为变量,将字符串作为返回类型。
接下来,我们需要使用Jar命令找到包含MD5类的hive-exec jar:
/opt/jdk**/bin/jar tf hive-exec-*.*.*-cdh**.jar | grep Md5
Jar命令通常位于Java存储库中的/ bin中,如果尚未在环境变量中对其进行配置。
您可以在../lib/hive/lib/中找到hive-exec-X-X.jar文件,如果找不到,只需使用定位命令
所以输出类似于:
/opt/jdk**/bin/jar tf hive-exec-*.*.*-cdh**.jar | grep Md5
org/apache/hadoop/hive/ql/udf/UDFMd5.class
将该路径保存以供以后使用,但我们将用“。”替换“ /”。并删除“ .class” 像这样 : org.apache.hadoop.hive.ql.udf.UDFMd5
将jar文件复制到HDFS可以访问的目录中,您可以将其重命名为简单的“我将其命名为hive-exec.jar”。
cp /lib/hive/lib/hive-exec.jar /opt/examples/
chown -R hdfs /opt/examples/
然后创建一个将罐子放入hdfs的地方
sudo -u hdfs hadoop fs -mkdir /user/hive/warehouse/hive_jars
使用以下命令将jar文件复制到HDFS:
sudo -u hdfs hadoop fs -copyFromLocal /opt/examples/hive-exec.jar /user/hive/warehouse/hive_jars/
因此,现在您只需要转到Impala-shell并连接到数据库,然后使用您到jar的HDFS路径和我们之前同意转换为符号的.class路径来创建函数。
Impala-shell>use udfs;
create function to_md5(string) returns string location '/user/hive/warehouse/hive_jars/hive-exec.jar' symbol='org.apache.hadoop.hive.ql.udf.UDFMd5';
现在您可以像使用任何Impala函数一样使用它:
select to_md5('test');
| udfs.to_md5('test') |
+----------------------------------+
| 098f6bcd4621d373cade4e832627b4f6 |
show functions ;
Query: show functions
+-------------+----------------------+-------------+---------------+
| return type | signature | binary type | is persistent |
+-------------+----------------------+-------------+---------------+
| STRING | to_md5(STRING) | JAVA | false |