Cross Join для расчета в Spark SQL - PullRequest
       23

Cross Join для расчета в Spark SQL

0 голосов
/ 03 августа 2020

У меня есть временное представление только с 1 записью / значением, и я хочу использовать это значение для вычисления возраста клиентов, представленных в другой большой таблице (с 100 M строками). Я использовал предложение CROSS JOIN, что привело к проблемам с производительностью.

Есть ли лучший подход для реализации этого требования, который будет работать лучше? Подойдет ли в этом случае подсказка broadcast? Каков рекомендуемый подход для решения такого сценария ios?

Справочная таблица: (содержит только 1 значение)

create temporary view ref
as
select to_date(refdt, 'dd-MM-yyyy') as refdt --returns only 1 value
from tableA
where logtype = 'A';

Таблица Cust (10 M строк):

custid | birthdt
A1234  | 20-03-1980
B3456  | 09-05-1985
C2356  | 15-12-1990

Запрос (вычислить возраст по birthdt):

select 
a.custid, 
a.birthdt, 
cast((datediff(b.ref_dt, a.birthdt)/365.25) as int) as age
from cust a
cross join ref b;

Мой вопрос: есть ли лучший подход для выполнения этого требования?

Спасибо

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Изнутри вы используете значение constant. Вы можете просто указать то же значение в запросе ниже без перекрестного соединения.

select 
a.custid, 
a.birthdt, 
cast((datediff(to_date('10-05-2020', 'dd-MM-yyyy'), a.birthdt)/365.25) as int) as age
from cust a;
scala> spark.sql("select * from cust").show(false)
+------+----------+
|custid|birthdt   |
+------+----------+
|A1234 |1980-03-20|
|B3456 |1985-05-09|
|C2356 |1990-12-15|
+------+----------+
scala> spark.sql("select a.custid, a.birthdt, cast((datediff(to_date('10-05-2020', 'dd-MM-yyyy'), a.birthdt)/365.25) as int) as age from cust a").show(false)
+------+----------+---+
|custid|birthdt   |age|
+------+----------+---+
|A1234 |1980-03-20|40 |
|B3456 |1985-05-09|35 |
|C2356 |1990-12-15|29 |
+------+----------+---+
0 голосов
/ 04 августа 2020

Трудно определить вашу точку зрения, но если вы не можете использовать Scala или pyspark и dataframes с .cache et c. тогда я думаю, что вместо использования temporary view просто создайте одну строку table. У меня сложилось впечатление, что вы используете Spark% sql в блокноте, скажем, на Databricks.

Это как бы мои подозрения.

При этом подсказка broadcastjoin вполне может означать оптимизатор отправляет только 1 строку. См. https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-hint-framework.html#specifying -запросы-подсказки

0 голосов
/ 03 августа 2020

Просто введите withColumn!

df.withColumn("new_col", lit("10-05-2020").cast("date"))
...