应该避免使用DataFrame功能组吗?

时间:2018-02-19 16:34:45

标签: python apache-spark pyspark spark-dataframe

linkothers告诉我,如果有大量的密钥,则不会使用Spark groupByKey,因为Spark会对所有密钥进行随机播放。这同样适用于groupBy功能吗?或者这是不同的东西?

我问这个是因为我想做this question尝试做的事情,但我有很多关键字。应该可以通过在本地减少每个节点来改变所有数据,但是我找不到PySpark的方法来执行此操作(坦率地说,我发现文档非常缺乏)。

基本上,我想做的是:

# Non-working pseudocode
df.groupBy("A").reduce(lambda x,y: if (x.TotalValue > y.TotalValue) x else y)

但是,dataframe API不提供“reduce”选项。我可能误解了数据框架究竟想要实现的目标。

2 个答案:

答案 0 :(得分:3)

DataFrame groupBy后跟agg不会不必要地移动数据,请参阅here以获得一个好例子。因此,没有必要避免它。

使用RDD API时,情况正好相反。在此处,最好避免使用groupByKey并尽可能使用reducebyKeycombineByKey。但是,有些情况确实需要使用groupByKey

使用DataFrame API执行此类操作的常规方法是使用groupBy,然后使用agg进行聚合。在您的示例中,您希望为每个组找到单个列的最大值,这可以通过max函数获得:

from pyspark.sql import functions as F

joined_df.groupBy("A").agg(F.max("TotalValue").alias("MaxValue"))

除了max之外,还有许多功能可以与agg结合使用,有关所有操作,请参阅here

答案 1 :(得分:0)

文档很到位。

对数据帧进行了大量优化工作。数据框有关于数据结构的其他信息,这有助于此。我经常发现由于“增加了优化”,许多人推荐使用RDD上的数据帧。

幕后有很多沉重的巫术。

我建议您在大型数据集上的RDD和数据帧上尝试“groupBy”并比较结​​果。有时,您可能需要这样做。

另外,为了提高性能,我建议(通过试验和错误)摆弄:

  1. 火花配置Doc
  2. shuffle.partitions Doc