我想根据一些属性计算不同行的出现次数,并返回每个不同行的结果:
我正在尝试groupBy
,以根据col3和col4列中的行值获得不同的行,并使用:
dF.select("col0","col1","col2","col3","col4").groupBy("col3","col4")
但是如何计算每个不同的";分组";一行
谢谢你的帮助。
您的说明还不太清楚,但我相信您正试图在col3
和col4
列的基础上,在groupBy
之后的行数中添加一列到dF
。
假设我们有以下数据帧:
+----+----+----+-----+----+
|col0|col1|col2| col3|col4|
+----+----+----+-----+----+
| 0| 10| 100|cat26|30.9|
| 1| 20| 200|cat13|22.1|
| 2| 30| 300|cat26|30.9|
| 3| 40| 400|cat26|30.9|
| 4| 50| 500|cat15|15.3|
| 5| 60| 600|cat13|22.1|
+----+----+----+-----+----+
首先,我们需要将每个col3
和col4
的行分组和聚合为名为grouped
的DataFrame
中隐含的werner。
// Scala
val grouped = dF.select("col0","col1","col2","col3","col4")
.groupBy("col3","col4")
.agg(count("*").as("counter"))
// Java
DataFrame grouped = dF.select("col0","col1","col2","col3","col4")
.groupBy("col3","col4")
.agg(count("*").as("counter"))
grouped
的结果是:
+-----+----+-------+
| col3|col4|counter|
+-----+----+-------+
|cat13|22.1| 2|
|cat26|30.9| 3|
|cat15|15.3| 1|
+-----+----+-------+
然后,我们必须joindF
和grouped
,使用它们的公共列(col3
、col4
(作为join的键(Seq
是Scala类,但您可以像这样将其加载到Java中。如果这会引发错误,请使用此处的解决方法(。联接后的select
方法是保留列的正确队列,因为join
自然地将col3
和col4
放在模式的开头。
// Scala
dF.join(grouped, Seq("col3", "col4"))
.select("col0","col1","col2","col3","col4", "counter")
// Java
dF.join(grouped, dF.col("col3").equalTo(grouped.col("col3")).and(dF.col("col4").equalTo(grouped.col("col4")))
.select("col0","col1","col2","col3","col4", "counter")
输出如下:
+----+----+----+-----+----+-------+
|col0|col1|col2| col3|col4|counter|
+----+----+----+-----+----+-------+
| 0| 10| 100|cat26|30.9| 3|
| 1| 20| 200|cat13|22.1| 2|
| 2| 30| 300|cat26|30.9| 3|
| 3| 40| 400|cat26|30.9| 3|
| 4| 50| 500|cat15|15.3| 1|
| 5| 60| 600|cat13|22.1| 2|
+----+----+----+-----+----+-------+