apache spark-在PySpark上按大小划分文件


0

我正在使用PySpark对df进行分区,并在S3上写入10个分区:

df.repartition(10).write.format("json").mode("OverWrite").save("s3Bucket")

如何分区df,但要基于分区大小而不是分区数量。例:我想有50 MB的n个分区。

1 答案


0

如果 DataFrame 是从位于bucket中的文件加载的,那么可以获取输入文件的大小,并使用它计算分区数。

这样的做法应该管用:

data_path = "/s3Bucket/path/"
PARTITION_BLOCK_SIZE = 50000000 # 50MB

using Hadoop FS API to get data len

Path = sc._gateway.jvm.org.apache.hadoop.fs.Path

fs = Path(data_path).getFileSystem(sc._jsc.hadoopConfiguration())
data_size = fs.getFileStatus(Path(data_path)).getLen()

repartition if size > 50MB

if (data_size / PARTITION_BLOCK_SIZE) > 1:
nb_partitions = math.ceil(data_size / PARTITION_BLOCK_SIZE)
df = df.repartition(nb_partitions)


我来回答

写文章

提问题

面试题