spark.csv如何确定读取的分区数?

时间:2018-05-23 20:26:15

标签: apache-spark

在Spark 2.2.0中:我正在使用

读取一个文件
spark.csv.read("filepath").load().rdd.getNumPartitions

我在一个系统中获得了一个350 MB文件的77个分区,在另一个系统中获得了88个分区。我还为28 GB文件获得了226个分区,大约28 * 1024 MB / 128 MB。问题是,Spark CSV数据源如何确定此默认分区数?

3 个答案:

答案 0 :(得分:1)

分区数受多种因素影响 - 通常为

  • spark.default.parallelism
  • 您正在阅读的文件数量(如果从目录中读取文件)
  • 群集管理员/影响spark.default.parallelism
  • 的核心数量(请参阅spark configuration

从文本文件(以及CSV)读取时的分区数应根据CSVDataSource确定为math.min(defaultParallelism, 2)

答案 1 :(得分:0)

从任何文件读取时的分区数均遵循以下公式。

第一步:从我在本地测试过的指定路径中找到文件大小/文件夹大小。您可以根据自己的要求(s3 / hdfs)进行查找。

import os
def find_folder_size(path):
    total = 0
    for entry in os.scandir(path):
        if entry.is_file():
            total += entry.stat().st_size
        elif entry.is_dir():
            total += find_folder_size(entry.path)
    return total

第2步:应用公式

target_partition_size = 200  #100 or 200 depends on your target partition
total_size = find_folder_size(paths)
print('Total size: {}'.format(total_size))
print(int(math.ceil(total_size / 1024.0 / 1024.0 / float(target_partition_size))))
num_partitions = int(math.ceil(total_size / 1024.0 / 1024.0 / float(target_partition_size)))
PARTITION_COLUMN_NAME = ['a','c']
df = df.repartition(num_partitions, PARTITION_COLUMN_NAME)
or 
df = df.repartition(num_partitions)

我们可以申请大数据/小数据来获取分区数。

答案 2 :(得分:0)

当读取csv文件(单个大文件或多个小文件,是否压缩)时,我发现spark.sql.files.maxPartitionBytes对生成的分区数量有很大的影响。调整此值(默认值为128MB,请参见https://spark.apache.org/docs/latest/sql-performance-tuning.html)对我来说很关键。