Попытка понять, как разделы 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 используется в объединении?