这link和others告诉我,如果有大量的密钥,则不会使用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”选项。我可能误解了数据框架究竟想要实现的目标。
答案 0 :(得分:3)
DataFrame groupBy
后跟agg
不会不必要地移动数据,请参阅here以获得一个好例子。因此,没有必要避免它。
使用RDD API时,情况正好相反。在此处,最好避免使用groupByKey
并尽可能使用reducebyKey
或combineByKey
。但是,有些情况确实需要使用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)