Hive 分区、Spark 分区和 Spark 中的连接 - 它们之间的关系

Mul*_*efa 5 hive apache-spark apache-spark-sql apache-spark-dataset

试图了解 Hive 分区与 Spark 分区的关系,最终解决了一个关于连接的问题。

我有 2 个外部 Hive 表;均由 S3 存储桶支持并由 分区date;所以在每个存储桶中都有名称为 format 的键date=<yyyy-MM-dd>/<filename>

问题 1:

如果我将此数据读入 Spark:

val table1 = spark.table("table1").as[Table1Row]
val table2 = spark.table("table2").as[Table2Row]
Run Code Online (Sandbox Code Playgroud)

那么结果数据集将分别有多少个分区?分区等于 S3 中的对象数量?

问题2

假设这两种行类型具有以下架构:

Table1Row(date: Date, id: String, ...)
Table2Row(date: Date, id: String, ...)
Run Code Online (Sandbox Code Playgroud)

并且我想加入table1table2在领域dateid

table1.joinWith(table2,
  table1("date") === table2("date") && 
    table1("id") === table2("id")
)
Run Code Online (Sandbox Code Playgroud)

Spark 是否能够利用被连接的字段之一是 Hive 表中的分区键来优化连接?如果是这样怎么办?

问题 3

假设现在我正在使用RDDs 代替:

val rdd1 = table1.rdd
val rdd2 = table2.rdd
Run Code Online (Sandbox Code Playgroud)

AFAIK,使用RDDAPI的连接语法如下所示:

rdd1.map(row1 => ((row1.date, row1.id), row1))
  .join(rdd2.map(row2 => ((row2.date, row2.id), row2))))
Run Code Online (Sandbox Code Playgroud)

同样,Spark 是否能够利用 Hive 表中的分区键在连接中使用的事实?

zer*_*323 4

那么生成的数据集分别有多少个分区?分区等于 S3 中的对象数量吗?

根据您提供的信息,无法回答。最新版本中的分区数量主要取决于spark.sql.files.maxPartitionByte,尽管其他因素也可以发挥一定作用。

Spark 是否能够利用 Hive 表中的分区键作为连接字段之一来优化连接?

从今天开始(Spark 2.3.0),Spark 可以利用分桶(bucketing)(DISTRIBUTE BY)来优化连接。请参阅如何定义 DataFrame 的分区?。一旦 Data Source API v2 稳定下来,这种情况将来可能会发生变化。

假设现在我正在使用 RDD(...)。同样,Spark 是否能够利用 Hive 表中的分区键在联接中使用这一事实?

一点也不。即使数据是分桶的 RDD 转换和函数Dataset转换也是黑匣子。无法应用任何优化,并且在此应用。