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将在“国家/地区”列中创建与多个唯一值一样多的目录。这是正确的理解吗?
一些差异:
bucketBy仅适用于与 DataFrameWriter.saveAsTable() 结合使用的基于文件的数据源,即保存到 Spark 托管表时,而partitionBy可在写入任何基于文件的数据源时使用。bucketBy适用于一次写入、多次读取的场景,其中创建数据源的持久分桶版本的前期成本通过避免在后续作业中读取时进行昂贵的洗牌而得到回报。而partitionBy对于满足 Spark 作业输出的下游消费者的数据布局要求非常有用。我猜想,第一种情况下的bucketBy会创建4个包含国家/地区的目录,而partitionBy将在“国家/地区”列中创建与多个唯一值一样多的目录。这是正确的理解吗?
是的,对于partitionBy. 但是bucketBy将创建 4 个存储桶文件(默认为 Parquet)。
与 Apache Hive 中的存储桶不同,Spark SQL 根据存储桶和分区的数量创建存储桶文件。换句话说,存储桶文件的数量是存储桶的数量乘以任务编写器的数量(每个分区一个)。
您还可以将bucketBy与partitionBy一起使用,其中每个分区(多级分区情况下的最后一级分区)将具有“n”个存储桶。
| 归档时间: |
|
| 查看次数: |
6623 次 |
| 最近记录: |