一致的 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 |
我正在寻找一种一致的方法来在 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 |