试图了解蜂巢分区与火花分区的关系,最终在有关加入的问题中达到最终形式。
我有2个外部蜂巢表;由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是否能够利用一个事实,即被连接的字段之一是蜂巢表中的分区密钥来优化连接?如果是这样?
问题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是否能够利用蜂巢表中的分区密钥在联接中使用的事实?
那么,由此产生的数据集分别分别具有多少个分区?分区等于S3中的对象数量?
无法回答您提供的信息。最新版本中的分区数量主要取决于spark.sql.files.maxPartitionByte
,尽管其他因素也可以发挥作用。
火花将能够利用一个事实,即被加入的字段之一是蜂巢表中的分区密钥来优化连接?
截至今天(Spark 2.3.0(,但是Spark可以利用铲斗(DISTRIBUTE BY
(来优化连接。查看如何定义数据框架的分区?一旦数据源API V2稳定,这可能会在将来发生变化。
假设现在我再次使用RDD(...(,Spark是否可以利用蜂巢表中的分区密钥在JOIN中使用的事实?
一点也不。即使数据是BACKET的RDD转换,功能Dataset
转换也是黑匣子。不能应用优化并在此处应用。
一般回答,
火花分区 - 大型分布式数据集的A(逻辑(块。Spark催生了一个单个分区的任务,该分区将在执行者JVM内部运行。
Hive分区是一种将表通过基于分区键(列(分为不同部分的表格,将表组织到分区中的一种方式。分区使访问数据变得更简单,清晰。
几个可以调整的配置 -
spark.sql.files.maxPartitionBytes
-读取文件时,要包装到单个分区的最大字节数(默认128MB(
spark.sql.files.openCostInBytes
-可以同时扫描以字节数来衡量的打开文件的估计成本。将多个文件放入分区时使用。更好地估计,然后使用小文件的分区要比具有较大文件的分区更快(首先计划(。(默认4 MB(
spark.sql.shuffle.partitions
-配置用于加入或聚合的数据时要使用的分区数。(默认为200(