试图了解 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 表中的分区键在连接中使用的事实?
最佳答案
无法回答您提供的给定信息。分区数 in latest versions 主要取决于 spark.sql.files.maxPartitionByte
,尽管其他因素也可以发挥一些作用。
不是今天(Spark 2.3.0),但是 Spark 可以利用分桶( DISTRIBUTE BY
)来优化连接。见 How to define partitioning of DataFrame? 。一旦数据源 API v2 稳定下来,这在 future 可能会改变。
一点也不。即使数据是分桶的 RDD 转换,functional Dataset
transformations 也是黑盒子。不能应用任何优化,并在此处应用。
关于apache-spark - Hive 分区、Spark 分区和 Spark 中的连接 - 它们之间的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50015828/