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