Контрольная сумма Spark / SQL 2.4 (), md5 и т.д.

#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