Spark/SQL 2.4 checksum()、md5等

Aci*_*der 6 presto apache-spark amazon-athena

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)
Run Code Online (Sandbox Code Playgroud)

上面的SQL查询作品在AWS雅典娜/普雷斯托,并产生一组行的单校验,这样我可以或者确定是否有任何数据已更改为一个表中的一组行的另一个表比较一组行的行集相等/不等式。

示例输出为 1 row/col 即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)
Run Code Online (Sandbox Code Playgroud)

此行集需要校验和/聚合为一个值,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)
Run Code Online (Sandbox Code Playgroud)

谢谢

Han*_*art 0

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

\n
SELECT to_hex(md5(to_utf8(\xe2\x80\x98Spark\xe2\x80\x99)))\n8CDE774D6F7333752ED72CACDDB05126\n
Run Code Online (Sandbox Code Playgroud)\n

\n
> SELECT md5(\'Spark\');\n 8cde774d6f7333752ed72cacddb05126\n
Run Code Online (Sandbox Code Playgroud)\n

更多详情请参见:

\n

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

\n