我正在寻找一种一致的方式来对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的方法。有人有什么建议吗?
这已经很晚了,但是让我们把它留在这里对其他可能觉得有帮助的人。
“在Impala中执行MD5的方法”是的,您可以在最新发行版中使用Hive在Impala中的任何内置功能(我使用的是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
因此,让我们模拟一下从蜂巢到Impala添加MD5功能。
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文件,如果找不到,只需使用locate命令即可
所以输出类似于:
/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路径和我们先前同意转换为symbol的.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 |