一致的 Hive 和 Impala 哈希?

Consistent Hive and Impala Hash?

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

现在回答太晚了,但让我们把它留在这里,以供其他可能觉得有用的人使用。

"A way to do MD5 in Impala" 是的,您可以在最近的版本 Impala 中使用 Hive 的 UDF 内置函数(我使用的是 CDH 5.12,它与 impala 2.9,和配置单元 1.1)

你可以在这里找到内置函数的列表 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

或者你可以简单地 运行 SHOW FUNCTIONS; 在你的蜂巢控制台 beeline -u jdbc:hive2://localhost:10000

所以让我们模拟一下将 MD5 函数从 hive 添加到 Impala。

DESCRIBE FUNCTION md5; 

为了确保函数存在,并知道输入和输出变量的类型,所以这里我们知道md5(string)接受一个字符串作为变量,一个字符串作为return类型。

接下来我们需要使用 Jar 命令找到包含我们的 MD5 class 的 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 可访问的目录中,您可以将其重命名以便于使用 'Im gonna name it 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 并连接到数据库,然后使用您的 HDFS 路径到 jar 和 .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         |