我有一个非常昂贵的Python函数(py_process
),所以我想在运行它时增加分区/并行度。这有效:
spark.createDataFrame(
spark.read.format("avro").load("/dir/*avro").rdd\
.repartition(200).flatMap(py_process),
schema=schema
).write.mode('overwrite').format('avro').save('/outdir/')
但是我最终得到200个输出文件。我想减少运行py_process
之后的分区数,以便获得较少数量的输出文件。
我尝试添加一个coalesce
:
spark.createDataFrame(
spark.read.format("avro").load("/dir/*avro")\
.rdd.repartition(200).flatMap(py_process)\
.coalesce(20),
schema=schema
).write.mode('overwrite').format('avro').save('/outdir/')
但是,这导致py_process
在20个分区上运行,而不是200个分区,这非常慢。
我在这里做错了什么?这是我希望Spark进行的操作: