Контрольная сумма Spark / SQL 2.4 (), md5 и т. Д. - PullRequest
1 голос
/ 21 марта 2019
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)

Спасибо

...