Hadoop 一致的蜂巢和黑斑羚散列?

Hadoop 一致的蜂巢和黑斑羚散列?,hadoop,hive,impala,Hadoop,Hive,Impala,我正在寻找一种一致的方法来在Hive查询语言和Impala查询语言中散列内容,其中散列函数产生相同的值,而不管它是在Hive中还是在Impala中完成的。为了澄清这一点,我想要一些像some\u hive\u hash\u thing(A)=some\u other\u impala\u hash\u thing(A) 对于Hive,我知道有使用MD5(或任何命令)的hash()。 对于Impala,我知道有fnv\u hash()使用fnv算法。我知道Hive和Impala有自己的哈希函数,但

我正在寻找一种一致的方法来在Hive查询语言和Impala查询语言中散列内容,其中散列函数产生相同的值,而不管它是在Hive中还是在Impala中完成的。为了澄清这一点,我想要一些像
some\u hive\u hash\u thing(A)=some\u other\u impala\u hash\u thing(A)

对于Hive,我知道有使用MD5(或任何命令)的
hash()
。 对于Impala,我知道有
fnv\u hash()
使用fnv算法。我知道Hive和Impala有自己的哈希函数,但它们完全不同


理想情况下,我正在寻找一种在Hive中执行
fnv_hash
的方法,或者在Impala中执行MD5的方法。有人有什么建议吗?

现在回答这个问题已经太迟了,但让我们把它保存在这里,让其他人知道它可能会有所帮助

“在黑斑羚中实现MD5的方法”是的,在最近的版本中,您可以使用黑斑羚中Hive的UDF内置功能(我使用的是CDH 5.12,它在黑斑羚2.9和Hive 1.1中运行良好)

您可以在这里找到内置函数的列表

或者你可以直接跑
显示函数
在您的蜂箱控制台中
beeline-ujdbc:hive2://localhost:10000

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

DESCRIBE FUNCTION md5; 
为了确保函数存在并知道输入和输出变量的类型,这里我们知道md5(string)将字符串作为变量,将字符串作为返回类型

接下来,我们需要使用jar命令找到包含MD5类的hive exec jar:

/opt/jdk**/bin/jar tf hive-exec-*.*.*-cdh**.jar | grep Md5
如果尚未在环境变量中配置Jar命令,则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/
然后创建一个地方,将jar放入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         |

“Hive
hash()
返回32位int并使用MD5”>这是胡说八道;阅读关于MD5的维基百科页面(扰流板:这是一种128位加密哈希——从加密的角度来看有缺陷,但仍然比粗糙的32位东西可靠得多)Hive有许多可用的哈希函数——在“大数据”中使用的粗糙的32位东西是危险的仅由于加密哈希函数
md5
(128位,有缺陷)
sha1
(160位)
sha2
(224至512位选项)的记录数(
hash
cf.或
crc32
)而导致冲突概率显著的上下文。除了你使用黑斑羚,因此你使用Cloudera,因此你被阻止使用过时版本的Hive,因此你甚至可能没有可用的加密哈希函数。MD5对我来说也很奇怪,我一定是误解了。我试着往里看,发现有很多选择。然而,它们似乎都与我在Impala中所能做的不一样。有趣的是,Impala在内部使用了多种哈希函数,将来可能会使用更多,但只公开了在SQL中使用的FNV-1a。您可以尝试使用Github上的一些java代码创建蜂巢UDF,但是确保您使用与IMPARC++实现相同的“素数”。例如:org.apache.hadoop.hive.ql.udf.GenericUDFSha2