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)
并且我想加入table1和table2在领域date和id:
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 表中的分区键在连接中使用的事实?
那么生成的数据集分别有多少个分区?分区等于 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转换也是黑匣子。无法应用任何优化,并且在此应用。
| 归档时间: |
|
| 查看次数: |
3372 次 |
| 最近记录: |