Spark 2.0读取csv分区数(PySpark)

时间:2016-06-30 16:02:50

标签: csv apache-spark pyspark

我正在尝试使用Spark 2.0中的新东西将一些代码从Spark 1.6移植到Spark 2.0。首先,我想使用Spark 2.0的csv阅读器。顺便说一句,我正在使用pyspark。

使用“旧”textFile函数,我可以设置最小分区数。例如:

file= sc.textFile('/home/xpto/text.csv', minPartitions=10)
header = file.first() #extract header
data = file.filter(lambda x:x !=header) #csv without header
...

现在,使用Spark 2.0,我可以直接阅读csv:

df = spark.read.csv('/home/xpto/text.csv', header=True)
...

但我找不到设置minPartitions的方法。

我需要这个来测试我的代码的性能。

THX, 佛瑞德

2 个答案:

答案 0 :(得分:5)

简答为否:如果使用DataFrameReader,则无法使用类似于minPartitions参数的机制设置最小条。

在这种情况下,可以使用

coalesce来减少分区计数,repartition可用于增加分区计数。当您使用coalesce时,如果通过提供shuffle参数(特别是在数据偏斜的情况下)强制进行随机播放,则下游性能可能会更好:coalesce(100,shuffle=True)。这会触发完整重播数据,这会带来与repartition类似的成本影响。

请注意,上述操作通常保持文件的原始顺序被读取(除非在没有shuffle参数的情况下运行coalesce),因此如果您的代码的一部分依赖于在数据集的顺序中,您应该避免在该点之前进行随机播放。

答案 1 :(得分:2)

我明白了。 DataFrame(和RDD)有一个名为" coalesce"的方法。可以设置分区数。

例如:

>>> df = spark.read.csv('/home/xpto/text.csv', header=True).coalesce(2)
>>> df.rdd.getNumPartitions()
2

就我而言,Spark将我的文件拆分为153个分区。我能够将分区数设置为10,但是当我尝试设置为300时,它会忽略并再次使用153(我不知道为什么)。

REF: https://spark.apache.org/docs/2.0.0-preview/api/python/pyspark.sql.html#pyspark.sql.DataFrame.coalesce