Разделы улья, разделы Spark и объединения в Spark - как они связаны - PullRequest
0 голосов
/ 25 апреля 2018

Попытка понять, как разделы Hive связаны с разделами Spark, завершается вопросом о соединениях.

У меня есть 2 внешних стола Hive; оба подкреплены S3-контейнерами и разделены date; поэтому в каждом ведре есть ключи с форматом имени date=<yyyy-MM-dd>/<filename>.

Вопрос 1:

Если я прочитал эти данные в Spark:

val table1 = spark.table("table1").as[Table1Row]
val table2 = spark.table("table2").as[Table2Row]

тогда сколько разделов будут иметь результирующие наборы данных соответственно? Разделы, равные количеству объектов в S3?

Вопрос 2 :

Предположим, что два типа строк имеют следующую схему:

Table1Row(date: Date, id: String, ...)
Table2Row(date: Date, id: String, ...)

и к которому я хочу присоединиться table1 и table2 на полях date и id:

table1.joinWith(table2,
  table1("date") === table2("date") && 
    table1("id") === table2("id")
)

Сможет ли Spark использовать тот факт, что одно из полей, к которым присоединяются, является ключом раздела в таблицах Hive, для оптимизации объединения? И если да, то как?

Вопрос 3 :

Предположим, теперь я использую RDD s вместо:

val rdd1 = table1.rdd
val rdd2 = table2.rdd

AFAIK, синтаксис объединения с использованием RDD API будет выглядеть примерно так:

rdd1.map(row1 => ((row1.date, row1.id), row1))
  .join(rdd2.map(row2 => ((row2.date, row2.id), row2))))

Опять же, сможет ли Spark использовать тот факт, что ключ объединения в таблицах Hive используется в объединении?

1 Ответ

0 голосов
/ 25 апреля 2018

тогда сколько разделов будут иметь результирующие наборы данных соответственно? Разделы, равные количеству объектов в S3?

Невозможно ответить на предоставленную вами информацию. Количество разделов в последних версиях зависит главным образом от spark.sql.files.maxPartitionByte, хотя некоторые факторы также могут играть определенную роль.

Сможет ли Spark использовать тот факт, что одно из полей, к которым присоединяются, является ключом раздела в таблицах Hive, для оптимизации объединения?

Не по состоянию на сегодняшний день (Spark 2.3.0), однако Spark может использовать сегментирование (DISTRIBUTE BY) для оптимизации объединений. См. Как определить разбиение DataFrame? . Это может измениться в будущем, как только стабилизируется Data Source API v2.

Предположим, что теперь я использую RDD (...) Опять же, сможет ли Spark использовать тот факт, что ключ объединения в таблицах Hive используется в объединении?

Совсем нет. Даже если данные сгруппированы в преобразования СДР и функциональные Dataset преобразования являются черными ящиками. Оптимизация не может быть применена и применяется здесь.

...