一致的Hive和Impala哈希?

时间:2018-09-07 16:54:09

标签: hadoop hive impala

我正在寻找一种一致的方式来对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的方法。有人有建议吗?

1 个答案:

答案 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         |