Apache spark 如何从Spark SQL中每个记录的一组特定键计算agregate
我有上面的数据集 我需要对给定id的pid列中的所有元素在tran1和tran2列上执行聚合。例如,对于id=1:我将聚合(求和)id等于1或2或3或4的记录中的数据 所需输出为: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
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 |
+---+-------+-----+-----+