Pyspark:为什么加入的spark数据帧的show()或count()这么慢?

时间:2018-09-24 07:45:35

标签: apache-spark dataframe join pyspark data-partitioning

我有两个大型Spark数据框。我在一个共同的专栏文章中加入了他们:

df_joined = df1.join(df2.select("id",'label'), "id")

我得到了结果,但是当我想使用df_joined时,它太慢了。据我所知,我们需要对df1和df2重新分区,以防止df_joined进行大量分区。所以,即使我更改了分区数,

df1r = df1.repartition(1)
df2r = df2.repartition(1)
df_joined = df1r.join(df2r.select("id",'label'), "id")

仍然无法正常工作。 任何想法吗?

1 个答案:

答案 0 :(得分:0)

Spark为RDD / DataFrame的每个分区运行1个并发任务(不超过集群中的核心数)。

如果您的集群有20个核心,则至少应有20个分区(实际上是2到3倍)。另一方面,单个分区通常不应超过128MB。

所以,而不是下面两行,它将数据帧重新划分为1个分区:

df1r = df1.repartition(1)
df2r = df2.repartition(1)

基于“ id”列(使用键)将数据重新分区为n个分区。 (n取决于数据大小和集群中的内核数。)

df1r = df1.repartition(n, "id")
df2r = df2.repartition(n, "id")