蜂巢分区,火花隔板和加入Spark - 它们如何联系



试图了解蜂巢分区与火花分区的关系,最终在有关加入的问题中达到最终形式。

我有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, ...)

我想在字段上加入table1table2 dateid

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(