我正在尝试使用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, 佛瑞德
答案 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(我不知道为什么)。