如何计算数据集中不同行的频率



我想根据一些属性计算不同行的出现次数,并返回每个不同行的结果:

我正在尝试groupBy,以根据col3和col4列中的行值获得不同的行,并使用:

dF.select("col0","col1","col2","col3","col4").groupBy("col3","col4")

但是如何计算每个不同的";分组";一行

谢谢你的帮助。

您的说明还不太清楚,但我相信您正试图在col3col4列的基础上,在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|
+----+----+----+-----+----+

首先,我们需要将每个col3col4的行分组和聚合为名为groupedDataFrame中隐含的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|
+-----+----+-------+

然后,我们必须joindFgrouped,使用它们的公共列(col3col4(作为join的键(Seq是Scala类,但您可以像这样将其加载到Java中。如果这会引发错误,请使用此处的解决方法(。联接后的select方法是保留列的正确队列,因为join自然地将col3col4放在模式的开头。

// 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|
+----+----+----+-----+----+-------+

最新更新