Apache spark 如何使用相同的聚合DataFramefor e连接DataFrame

Apache spark 如何使用相同的聚合DataFramefor e连接DataFrame,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,给定一个数据帧 +---+---+----+ | id| v|date| +---+---+----+ | 1| a| 1| | 2| a| 2| | 3| b| 3| | 4| b| 4| +---+---+----+ 我们想添加一列,平均值为date,乘以v +---+---+----+---------+ | v| id|date|avg(date)| +---+---+----+---------+ | a| 1| 1| 1.5|

给定一个数据帧

+---+---+----+
| id|  v|date|
+---+---+----+
|  1|  a|   1|
|  2|  a|   2|
|  3|  b|   3|
|  4|  b|   4|
+---+---+----+
我们想添加一列,平均值为date,乘以v

+---+---+----+---------+
|  v| id|date|avg(date)|
+---+---+----+---------+
|  a|  1|   1|      1.5|
|  a|  2|   2|      1.5|
|  b|  3|   3|      3.5|
|  b|  4|   4|      3.5|
+---+---+----+---------+
是否有更好的方法(例如在性能方面)

更准确地说,我认为这次加入将引发一场洗牌

[更新]添加一些精度,因为我不认为这是重复的。在这种情况下,联接有一个键

我可以选择不同的方法来避免它:

  • 自动的。Spark具有AutomaticRoadCastJoin,但它要求已计算配置单元元数据。对吧?
  • 通过使用已知的分区器?如果是,如何使用DataFrame实现
  • 通过强制广播(leftDF.join)(广播(rightDF),使用column=“v”)
可能的副本
val df = sc.parallelize(List((1,"a",1), (2, "a", 2), (3, "b", 3), (4, "b", 4))).toDF("id", "v", "date")
val aggregated = df.groupBy("v").agg(avg("date"))
df.join(aggregated, usingColumn = "v")