RDD的分区与桶之间是否存在关系,RDD的内容在随机操作之前会映射到这些关系?
其次,具有相同密钥的所有密钥值对是否会被随机分配到同一个桶中,还是将密钥值对随机分配给桶?指定分区(散列/范围)是否会对此分布产生任何影响?
答案 0 :(得分:2)
RDD的分区与桶之间是否存在关系,RDD的内容在随机操作之前会映射到这些关系?
如果您询问分段表格(bucketBy
和spark.table("bucketed_table")
之后),我认为答案是肯定的。
让我通过回答是来告诉你我的意思。
val large = spark.range(1000000)
scala> println(large.queryExecution.toRdd.getNumPartitions)
8
scala> large.write.bucketBy(4, "id").saveAsTable("bucketed_4_id")
18/04/18 22:00:58 WARN HiveExternalCatalog: Persisting bucketed data source table `default`.`bucketed_4_id` into Hive metastore in Spark SQL specific format, which is NOT compatible with Hive.
scala> println(spark.table("bucketed_4_id").queryExecution.toRdd.getNumPartitions)
4
换句话说,分区的数量(在加载一个分区表之后)正好是桶的数量(你在保存它时定义的)。
其次,具有相同密钥的所有密钥值对是否会被随机分配到同一个桶中,还是将密钥值对随机分配到桶中?
Spark 2.3(我相信早期版本的工作方式相似)每个分区都会进行分段(一个编写器任务),即每个分区都有你定义的桶数。
在上面的例子中,你将得到8个(分区)x 4(桶)= 32个桶文件(_SUCCESS
有两个额外的行,而标题给出34个。)
$ ls -ltr spark-warehouse/bucketed_4_id | wc -l
34
指定分区程序(散列/范围)是否会对此分布产生任何影响?
我认为是因为分区程序用于跨分区分发数据。