Использование CLUSTER BY с запросами Spark SQL - PullRequest
0 голосов
/ 20 июня 2020

Недавно я познакомился со Spark- SQL. Я где-то читал об использовании CLUSTER BY в join столбцах (перед объединением) для повышения производительности join. Пример:

create temporary view prod as
select id, name
from product
cluster by id; 

create temporary view cust as
select cid, pid, cname
from customer
cluster by pid;

select c.id, p.name, c.name 
from prod p
join cust c
on p.id = c.pid;

Кто-нибудь может объяснить, в каком сценарии ios следует использовать то же самое? Я понимаю, что для соединения данные перетасовываются. Тогда какие преимущества дает CLUSTER BY, поскольку он также перемешивает данные?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Spark распознает кластер и перетасует данные. Однако, если вы используете те же столбцы в последующих запросах, которые вызывают перемешивание, Spark может повторно использовать обмен.

1 голос
/ 20 июня 2020

Если вы используете интерфейс SQL, вы можете делать что-либо без использования интерфейса DF.

Cluster By совпадает с:

df.repartition($"key", n).sortWithinPartitions()

Из-за ленивой оценки , Spark увидит JOIN и узнает, что вы указали, что хотите переразбить по ключу - через SQL, а не как в приведенном выше заявлении - так что это просто интерфейс, составляющий то же самое. Упрощает работу только в режиме SQL. Вы можете смешивать.

Если вы этого не сделаете, Spark сделает это за вас (в общем) и применит текущий параметр перемешивания разделов.

SET spark.sql.shuffle.partitions = 2
SELECT * FROM df CLUSTER BY key

совпадает с:

df.repartition($"key", 2).sortWithinPartitions()
spark.sql('''SELECT /*+ REPARTITION(col,..) */ cols... from table''')

ОБНОВЛЕНИЕ

Это не относится к СОЕДИНЕНИЮ таким образом:

val df = spark.sql(""" SELECT /*+ REPARTITION(30, c1) */ T1.c1, T1.c2, T2.c3
                         FROM T1, T2   
                        WHERE T1.c1 = T2.c1
                   """) 

Это приводит к повторному разделению после обработки ПРИСОЕДИНЯЙТЕСЬ. JOIN будет использовать большее из номеров секционирования, установленных на T1 и T2, или перемешивать разделы, если не задано явно.

...