Spark将文件从多个分区压缩到具有更大文件的单个分区
Spark Compressing files from Multiple partitions into Single partition with larger files
我想将通过 s3 上的多个分区层分布的小镶木地板文件压缩成更大的文件,并将单个分区返回到 s3。
所以在这个例子中,我有 3 个分区层(part1
、part2
、part3
)。我想获取此数据并将其写回仅按 part2
分区
我的第一个 运行 通过我使用:
df = spark.read
.option("basePath", "s3://some_bucket/base/location/in/s3/")
.parquet("s3://some_bucket/base/location/in/s3/part1=*/part2=*/part3=*/")
df.write.partitionBy("part2").parquet("s3://some_bucket/different/location/")
这在大部分情况下都有效,但这似乎仍然会创建较小的文件。因为我不是 运行宁 coalesce
或 repartition
。这让我想到了我的问题。有没有一种方法可以根据 size/row 计数轻松地将这些文件压缩成更大的文件?
提前致谢!
Is there a way I can easily compress these files into larger files based on size/row counts?
不是真的。 Spark 不提供任何可用于限制输出文件大小的实用程序,因为每个文件通常对应于一个分区。
所以 repartitioning
与用于 partitionBy
的同一列是你最好的选择。
选项("maxRecordsPerFile", 400000)
写入文件时使用此选项。
我想将通过 s3 上的多个分区层分布的小镶木地板文件压缩成更大的文件,并将单个分区返回到 s3。
所以在这个例子中,我有 3 个分区层(part1
、part2
、part3
)。我想获取此数据并将其写回仅按 part2
我的第一个 运行 通过我使用:
df = spark.read
.option("basePath", "s3://some_bucket/base/location/in/s3/")
.parquet("s3://some_bucket/base/location/in/s3/part1=*/part2=*/part3=*/")
df.write.partitionBy("part2").parquet("s3://some_bucket/different/location/")
这在大部分情况下都有效,但这似乎仍然会创建较小的文件。因为我不是 运行宁 coalesce
或 repartition
。这让我想到了我的问题。有没有一种方法可以根据 size/row 计数轻松地将这些文件压缩成更大的文件?
提前致谢!
Is there a way I can easily compress these files into larger files based on size/row counts?
不是真的。 Spark 不提供任何可用于限制输出文件大小的实用程序,因为每个文件通常对应于一个分区。
所以 repartitioning
与用于 partitionBy
的同一列是你最好的选择。
选项("maxRecordsPerFile", 400000)
写入文件时使用此选项。