存储桶和分区之间有什么关系?

时间:2015-08-12 16:52:05

标签: apache-spark apache-spark-sql

RDD的分区与桶之间是否存在关系,RDD的内容在随机操作之前会映射到这些关系?

其次,具有相同密钥的所有密钥值对是否会被随机分配到同一个桶中,还是将密钥值对随机分配给桶?指定分区(散列/范围)是否会对此分布产生任何影响?

1 个答案:

答案 0 :(得分:2)

  

RDD的分区与桶之间是否存在关系,RDD的内容在随机操作之前会映射到这些关系?

如果您询问分段表格bucketByspark.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
  

指定分区程序(散列/范围)是否会对此分布产生任何影响?

我认为是因为分区程序用于跨分区分发数据。