【发布时间】:2019-09-08 18:48:33
【问题描述】:
在 Spark Dataframe 上执行第一个和最后一个聚合函数时出现意外结果。
我有一个包含 colA、colB、colC、colD、colE、extraCol1、extraCol2 列的 spark 数据框
我需要通过
对这个数据框进行聚合分组 -> colA & colB,max -> colC,max -> colD,first -> colE, extraCol1, extraCol2
所以下面是我正在使用的数据帧(df),我正在使用火花分区(3)
colA colB colC colD colE extraCol1 extracol2
Harshit 23 43 44 A q z
Mohit 24 56 62 B w x
Harshit 23 32 44 C e c
Kali 10 20 460 D r v
Aman 20 30 180 E t b
Ram 30 100 270 F yu n
Kali 10 600 360 G io m
Kali 10 600 460 k p o
下面是我用来执行groupBy操作的scala和spark代码
val cols = List("colA","colB")
var aggFuncSeq = List(max(`colC`) as colC_new, max(`colD`) as colD_new, first(`colE`,true) as colE, first(`extracol2`,true) as extracol2, first(`extraCol1`,true) as extraCol1)
var aggFuncs = aggFuncSeq.map(e => expr(e))
df = df.groupBy(cols.head, cols.tail: _*).agg(aggFuncs.head, aggFuncs.tail: _*)
df.show(10)
执行后,我得到了意想不到的结果,如下所示。
colA colB colC_new colD_new colE extracol2 extraCol1
Harshit 23 43 44 C c e
Aman 20 30 180 E b t
Kali 10 600 460 D v r
Ram 30 100 270 F n yu
Mohit 24 56 62 B x w
但是根据所执行的分组条件和聚合操作,输出结果应该有对应于Harshit的第一行,对于colE,extracol2,extracol1
所以,预期的结果如下
colA colB colC_new colD_new colE extracol2 extraCol1
Harshit 23 43 44 A q z
Aman 20 30 180 E b t
Kali 10 600 460 D v r
Ram 30 100 270 F n yu
Mohit 24 56 62 B x w
但我无法理解这个 SQL 概念,这怎么可能。所以,如果有人能帮我解决这个奇怪的问题。
是因为分区吗?
它是如何给出这个结果的以及如何将它修复为预期的结果?
感谢任何帮助。 谢谢
【问题讨论】:
-
首先是窗口函数,直到你按它排序才会给你预期的结果。你需要做一些像 Window.partitionBy(colA,colB).orderBy(colE))
-
@sp_user123 然后我也可以做 max(colE) ,它会给我同样的结果。但我想根据用户提供的输入数据框获取第一列或最后一列
-
orderby(colE) 只是一个例子,在你的情况下,我认为你需要使用与 group coulmns 相同的键(desc 或 asc)
-
您可能需要在进行任何改组之前添加一列
F.monotonically_increasing_id -
@TarunKhaneja 请查看下面的选项,如果适合您的需求/问题,请不要忘记接受答案。谢谢!
标签: scala apache-spark dataframe apache-spark-sql