Spark/SQL 2.4 校验和()、md5 等

Posted

技术标签:

【中文标题】Spark/SQL 2.4 校验和()、md5 等【英文标题】:Spark/SQL 2.4 checksum(), md5, etc 【发布时间】:2019-08-11 21:14:19 【问题描述】:
SELECT checksum(c)
FROM 
(
   SELECT to_hex( md5( to_utf8( 
    concat(
          trim(coalesce("dcpheader_dcploaddayutc",'')),
          trim(coalesce("dcpheader_dcploadmonthutc",''))
          )
          ) ) ) -- end of to_hex, md5, to_utf ()
    FROM datalake_landing.instantoffer_v2_member_new
) as z(c)

上述 SQL 查询在 AWS Athena/Presto 中运行,并为一组行生成一个校验和,以便我可以确定是否有任何数据发生了变化或进行比较一个表中的一组行与另一个表中的一组行用于行集相等/不等式。

样本输出为 1 行/列,即 f5 09 49 03 a6 26 fd 5e

遗憾的是,上述 SQL 在 Spark/SQL 2.4 中不起作用(截至 2019 年 3 月的最新版本)。

在 Spark SQL 中运行相同的语句会产生错误,因为内置函数不存在,至少与 Presto 中的名称不同。

https://spark.apache.org/docs/latest/api/sql/index.html#hex

我查看了 Spark/SQL 函数列表,但没有找到与 Presto 等效的校验和

我想知道的是是否可以更改 SQL 查询以在 Spark/SQL 2.4 中产生相同的结果? 理想情况下是在纯 Spark/SQL 中还是作为使用 PySpark/SQL 的第二个选项?

这是我目前的 Spark/SQL 版本:

spark.sql("""SELECT hex( md5( \
    encode( \
      concat( \
        trim(coalesce(dcpheader_dcploaddayutc,'')), \
        trim(coalesce(dcpheader_dcploadmonthutc,''))
        ) \
        , 'utf-8') ) )  \
    FROM datalake_landing.instantoffer_v2_member_new """).show(10,False)

这个行集需要校验和/聚合成一个值,Presto 使用 Checksum() 函数处理。

下面是一个“穷人”替代品,它使用逐行校验和进行内部连接来比较两个行集的相等性 - 目标表和目标表。 我希望在 Presto 校验和聚合提供的 Spark SQL 中提供更简单/更清洁/更快的替代方案。

spark.sql(""" \
        with t1 as ( \
        SELECT hex( md5( encode( \
            concat( \
                  trim(coalesce(dcpheader_generatedmessageid,'')), \
                  trim(coalesce(dcpheader_dcploadmonthutc,'')) \
                  ), 'utf-8') \
                  )) as c \
        FROM datalake_reporting.instantoffer_v2_member_6 order by c), \
        t2 as ( \
        SELECT hex( md5( encode( \
            concat( \
                  trim(coalesce(dcpheader_generatedmessageid,'')), \
                  trim(coalesce(dcpheader_dcploadmonthutc,'')) \
                  ), 'utf-8') \
                  ) )  as c \
         FROM datalake_landing.instantoffer_v2_member_new \
           order by c) \
        select count(*) from t1 inner join t2 using (c) \
        """).show(100, False)

谢谢

【问题讨论】:

【参考方案1】:

我能够在 Athena (Presto) 中运行 SQL md5 查询,它提供与 Spark 相同的输出,见下文:

SELECT to_hex(md5(to_utf8(‘Spark’)))
8CDE774D6F7333752ED72CACDDB05126

对比

> SELECT md5('Spark');
 8cde774d6f7333752ed72cacddb05126

查看详情:

https://spark.apache.org/docs/latest/api/sql/index.html#hex https://prestodb.io/docs/current/functions/binary.html

【讨论】:

以上是关于Spark/SQL 2.4 校验和()、md5 等的主要内容,如果未能解决你的问题,请参考以下文章

.md5文件怎么用的

怎么在windows下check md5

Linux命令-md5sum

下载软件后为啥要验证md5?

linux下文件校验的使用

Shell脚本对Linux进行文件校验