首页 > 解决方案 > 如何在 Hive 中对整行进行 md5 处理?

问题描述

使用 Hive,我想对查询中的整行进行哈希处理。

我尝试了以下方法(不要介意 ${xxx},查询是从 bash 脚本构建的):

    SELECT md5(*) FROM ${DATABASE_NAME_SUFFIXE}.${DATABASE_PREFIXE}_${TABLE_NAME} WHERE 
${TABLE_DATE_FIELD} <= '${LIMIT_DATE}' ORDER BY ${CREATION_DATE_FIELD} DESC LIMIT 1

这将返回以下错误:

第 1:7 行错误的参数“md5”:类 org.apache.hadoop.hive.ql.udf.UDFMd5 没有匹配方法与 (bigint, int, varchar(128), timestamp, timestamp, varchar(64), varchar( 64)、varchar(64)、int、bigint、int、varchar(50)、varchar(255)、bigint、时间戳、时间戳、varchar(64)、bigint、时间戳、时间戳、varchar(64)、int、int、 char(38)、varchar(40)、varchar(1))。可能的选择:FUNC(二进制) FUNC(字符串)

如果我从错误和 md5 函数的文档中正确理解,我需要传递二进制或字符串。我怎样才能做到这一点?

编辑:也试过:

SELECT md5(SELECT * FROM ${DATABASE_NAME_SUFFIXE}.${DATABASE_PREFIXE}_${TABLE_NAME} WHERE ${TABLE_DATE_FIELD} <= '${LIMIT_DATE}' ORDER BY ${CREATION_DATE_FIELD} DESC LIMIT 1) 

返回

无法识别函数规范中“SELECT”“*”“FROM”附近的输入

标签: hivehiveql

解决方案


concat所有列,然后md5()在连接列上。

select md5(concat(a,b)) as md5 from (select string("abc")a,int("2")b)e;
+--------------------------------+
|md5                             |
+--------------------------------+
|63872b5565b2179bd72ea9c339192543|
+--------------------------------+

我们还可以定义具有所有列名的变量,然后在concat函数中使用!


Try with concat(*):

select md5(concat(*)) as md5 from (select string("abc")a,int("2")b)e;
+--------------------------------+
|md5                             |
+--------------------------------+
|63872b5565b2179bd72ea9c339192543|
+--------------------------------+

推荐阅读