在 PySpark 中读取文本文件时有没有办法控制分区数

Is there a way to control the number of partitions when reading a text file in PySpark

我正在 PySpark 中使用以下命令读取文本文件

rating_data_raw = sc.textFile("/<path_to_csv_file>.csv")

有没有办法指定RDD rating_data_raw应该被分割成多少个分区?我想指定大量分区以提高并发性。

正如其他用户所说,您可以通过在 textFile 的可选参数 minPartitions 中设置读取文件时设置将创建的最小分区数。

rating_data_raw = sc.textFile("/<path_to_csv_file>.csv", minPartitions=128)

另一种方法是使用repartition or coalesce,如果你需要减少分区的数量你可以使用coalesce,否则你可以使用repartition.

rating_data_raw = sc.textFile("/<path_to_csv_file>.csv").repartition(128)

也可以读取 .csv 文件,然后使用 df 到 RDD 转换检查分区。我在下面留下一个示例结构。

dataset = spark.read.csv("data.csv", header=True, inferSchema='True')
colsDrop = ("data_index", "_c17", "song_title", "artist")
df = dataset.drop(*colsDrop)
rdd = sc.parallelize(df.collect()).partitionBy(8)

这里.partitionBy()允许你控制一个RDD对象的分区数。也可以使用 .getNumPartition() 方法找出这些数字。

唯一需要注意的是 CPU 上的分区数多于线程数不会给我们带来速度增益。

比如我的CPU中的线程数是8,你可以在下面看到一个示例时间分布。

正如你所看到的,我在 8 个分区后无法获得速度。