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 г.).
Выполнение того же оператора в 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 ().
Ниже представлен заменитель «бедняк», который использует строку за строкой контрольную сумму для внутреннего объединения, чтобы сравнить два набора строк на равенство.- таблицы назначения и назначения.Я надеялся на более легкую / чистую / быструю альтернативу в 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)
Спасибо