为什么Spark不尊重多个分区?

时间:2019-02-16 18:16:20

标签: python apache-spark pyspark

我有一个非常昂贵的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进行的操作:

  1. 读取数据
  2. 分区为大量分区
  3. 在每个分区上并行运行Python函数
  4. 减少分区数
  5. 写输出

0 个答案:

没有答案