#apache-spark #amazon-athena #presto
#apache-spark #amazon-athena #presto
Вопрос:
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 строке / col, т. е. 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().
Ниже приведена замена «бедного человека», которая использует построчную контрольную сумму для внутреннего соединения для сравнения двух наборов строк для таблиц равенства — целевой и destination. Я надеялся на более простую / чистую / быструю альтернативу в Spark SQL, которую предоставляет Presto checksum aggregate.
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:
Мне удалось запустить запрос SQL md5 в Athena (Presto), который предоставил тот же результат, что и 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