Spark中bucketBy和partitionBy有什么区别?

Ale*_*aev 8 hadoop partitioning hdfs apache-spark pyspark

比如我要保存一张表,这两种策略有什么区别?

桶由:

someDF.write.format("parquet")
      .bucketBy(4, "country")
      .mode(SaveMode.OverWrite)
      .saveAsTable("someTable")
Run Code Online (Sandbox Code Playgroud)

分区依据:

someDF.write.format("parquet")
      .partitionBy("country") # <-- here is the only difference
      .mode(SaveMode.OverWrite)
      .saveAsTable("someTable")
Run Code Online (Sandbox Code Playgroud)

我猜想,第一种情况下的bucketBy会创建4个包含国家/地区的目录,而partitionBy将在“国家/地区”列中创建与多个唯一值一样多的目录。这是正确的理解吗?

Chr*_*ris 7

一些差异:

我猜想,第一种情况下的bucketBy会创建4个包含国家/地区的目录,而partitionBy将在“国家/地区”列中创建与多个唯一值一样多的目录。这是正确的理解吗?

是的,对于partitionBy. 但是bucketBy将创建 4 个存储桶文件(默认为 Parquet)。


ala*_*een 0

与 Apache Hive 中的存储桶不同,Spark SQL 根据存储桶和分区的数量创建存储桶文件。换句话说,存储桶文件的数量是存储桶的数量乘以任务编写器的数量(每个分区一个)。

您还可以将bucketBy与partitionBy一起使用,其中每个分区(多级分区情况下的最后一级分区)将具有“n”个存储桶。