Apache spark 如何从Spark SQL中每个记录的一组特定键计算agregate

Apache spark 如何从Spark SQL中每个记录的一组特定键计算agregate,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有上面的数据集 我需要对给定id的pid列中的所有元素在tran1和tran2列上执行聚合。例如,对于id=1:我将聚合(求和)id等于1或2或3或4的记录中的数据 所需输出为: id pid tran1 tran2 1 1,2,3,4 5 3 2 2,4 10 6 3 3 15 9 4 4 20 12 你是新手吗?你能重写/修正你的问题吗?这很难理解。可能会为给定的输出添加所需的输出input@anurag

我有上面的数据集

我需要对给定id的pid列中的所有元素在tran1和tran2列上执行聚合。例如,对于id=1:我将聚合(求和)id等于1或2或3或4的记录中的数据

所需输出为:

id  pid     tran1 tran2
1   1,2,3,4 5     3
2   2,4     10    6
3   3       15    9
4   4       20    12

你是新手吗?你能重写/修正你的问题吗?这很难理解。可能会为给定的输出添加所需的输出input@anurag_udasi如果解决了您的问题,请将我的答案标记为最终答案。@Nikk-这是为fist key添加所有值,因此,假设1的tran_1值=10,如果它有child,则添加10等于child的数量,因此实际上不接受它的child tran_1值你能提供准确的数据和细节,比如你如何want@Nikk-谢谢你的回复。我已经更新了我的问题。可以参照新值。
id pid      tran1   tran2
1  1,2,3,4  50      30
2  2,4      30      18
3  3        15      9
4  4        20      12
scala> df.show
+---+-------+-----+-----+
| id|    pid|tran1|tran2|
+---+-------+-----+-----+
|  1|1,2,3,4|    5|    3|
|  2|    2,4|   10|    6|
|  3|      3|   15|    9|
|  4|      4|   20|   12|
+---+-------+-----+-----+

scala> val df1 = df.withColumn("pid", explode(split(col("pid"), ",")))

scala> val df2 = df1.alias("df1").join(df.alias("df"), col("df1.pid") === col("df.id"),"left").select(col("df1.id"),col("df1.pid"),col("df.tran1"),col("df.tran2"))

scala> df2.show
+---+---+-----+-----+
| id|pid|tran1|tran2|
+---+---+-----+-----+
|  1|  1|    5|    3|
|  1|  2|   10|    6|
|  1|  3|   15|    9|
|  1|  4|   20|   12|
|  2|  2|   10|    6|
|  2|  4|   20|   12|
|  3|  3|   15|    9|
|  4|  4|   20|   12|
+---+---+-----+-----+

scala> df2.groupBy(col("id")).agg(concat_ws(",",collect_list(col("pid"))).alias("pid"), sum(col("tran1")).alias("tran1"), sum(col("tran2")).alias("tran2")).orderBy(col("id")).show(false)
+---+-------+-----+-----+
|id |pid    |tran1|tran2|
+---+-------+-----+-----+
|1  |1,2,3,4|50.0 |30.0 |
|2  |2,4    |30.0 |18.0 |
|3  |3      |15.0 |9.0  |
|4  |4      |20.0 |12.0 |
+---+-------+-----+-----+