Spark/SQL 2.4 checksum(), md5, etc


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查询 Works 在AWS Athena/presto 中,并为一组行生成单个校验和,以便我可以确定任何数据是否已更改或进行比较一个表中的一组行,在另一个表中有一组行,用于行平等/不等式。

样本输出为1行/col即

可悲的是,以上SQL确实在Spark/SQL 2.4 中不起作用(截至2019年3月起的最新版本)。

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

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

我查看了Spark/SQL功能列表,找不到 checksum 等效于Presto。

我想知道的是,是否可以更改SQL查询以在Spark/SQL 2.4中产生相同的结果?理想情况下,使用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用charksum()函数处理。

下面是一种"穷人"替代品,它使用逐行检查的内在连接使用,以比较两个行集的平等 - 目标和目标表。我希望在Spark SQL中更容易/更清洁/更快的替代方案,PRESTO校验和骨料提供。

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)

谢谢

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

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

vs。

> SELECT md5('Spark');
 8cde774d6f7333752ed72cacddb05126

有关更多详细信息:

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

相关内容

  • 没有找到相关文章

最新更新