#sql #scala #apache-spark #hive #apache-spark-sql
#sql #scala #apache-spark #hive #apache-spark-sql
Вопрос:
Я работаю над проектом потоковой передачи spark, в котором входящий поток объединяется с несколькими таблицами Hive. Итак, я загружаю таблицу в spark и кэширую ее.
Ниже приведен пример запроса-
val df = sql("select * from (select *, row_number() over (partition by a , b , c, d order by date desc) row_num from test) tmp where tmp.row_num = 1")
В таблице 99% повторяющихся данных, поэтому я использую логику номера строки, чтобы получить distinct. Когда я это сделал df.explain(true)
, в pushdown нет условия. Таким образом, вся таблица загружается в память. Таблица содержит миллиарды данных. что выдает FAILED_TO_UNCOMPRESS(5)
ошибку.
Должен ли я создать представление Hive, используя приведенный выше запрос, и вызвать представление в spark, чтобы оно извлекло результирующие данные. Я не знаю, работает ли это.
Существует около 10 таблиц, которые загружаются в spark каждые 15 минут. У всех одинаковая логика номера строки. Как включить принудительное отключение? Таким образом, spark может извлекать результирующие данные только из Hive.
Комментарии:
1. Краткий вопрос: будут ли a, b, c, d,date создавать уникальную запись?
2. Привет @lucy, вопрос в том, какой запрос использовать или как включить принудительную фильтрацию в Spark?
Ответ №1:
Вы пробовали использовать функцию MAX вместо ROW_NUM ? Проблема может быть в использовании ROW_NUM. Я бы использовал следующий запрос :
val df = sql("select *, MAX(date) over (partition by a , b , c, d) from test")
Для получения более подробной информации смотрите максимальное определение функции.
Комментарии:
1. появляется множество повторяющихся записей
2. что вы подразумеваете под дублированием? этот запрос гарантирует, что кортеж (дата, a, b, c, d) является уникальным