【问题标题】:(py)spark dataframe repartition across many IDs(跨多个 ID 的 pyspark 数据帧重新分区
【发布时间】:2021-10-15 20:58:28
【问题描述】:

我有一张巨大的桌子,我的 spark 工作一直在崩溃。我想重新分区。我有两个变量(idtime),我需要确保具有给定id 的所有行都将被分配给同一个工作人员。但我有数亿个唯一 ID。 我希望 pyspark 均匀分布数据,但尊重给定 ID 的所有行都应该在一个工作人员上。我可以简单地做吗:

df.repartition("id")

documentation 似乎暗示了这一点。但我想知道 spark 现在是否会将作业划分为数亿个子集,并且一次只向每个工作人员发送一个子集(即一个 id 的数据)。这当然是非常低效的。

我正在使用 Spark 2.4.0-cdh6.2.1

【问题讨论】:

    标签: python apache-spark pyspark partitioning


    【解决方案1】:

    让我们使用explain 看看当你调用repartition 时spark 做了什么:

    >>> spark.range(20).repartition("id").explain()
    == Physical Plan ==
    Exchange hashpartitioning(id#0L, 200)
    +- *(1) Range (0, 20, step=1, splits=8)
    

    Exchange hashpartitioning(id#0L, 200) 表示将数据洗牌到 200 个分区中。行结束的分区由id.hashCode() % 200 确定。如果您的数据没有偏差,则分布应该非常均匀。 200 是spark.sql.shuffle.partitions 的默认值,它决定了shuffle 后生成了多少个分区。要将该值更改为 400,您可以将配置的值更改为 spark.conf.set("spark.sql.shuffle.partitions", 400)repartition(400, "id")。事实上,如果你有很多数据,200 条可能还不够。

    【讨论】:

    • repart...400 和 join aggr 后你将得到 200,除非明确设置 cia shufflepartitions。
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2021-03-14
    • 2021-02-16
    • 2023-03-24
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多