在Spark Scala或Spark Java中选择一个列和列值的频率

时间:2018-07-17 10:06:02

标签: java scala apache-spark apache-spark-sql

我有一个如下表。

select * from employee;

eid     salary  location
1003    1007    wyd     
1006    1009    mah     
1008    1100    ind     
1009    1100    mah     
1010    1100    mah 

我需要找到相似薪水的频率(表中有多少个条目具有相同薪水)和位置以及开斋节

在蜂巢中,我编写了如下查询,并且有效。

hive> select eid, count (*) over (partition by salary) as levelCount, count(*) over (partition by location) as areacount from employee;


1003 1 1    
1006 1 3   
1008 3 1   
1009 3 3   
1010 3 3

如何通过对数据帧进行操作在spark中编写类似的代码。

2 个答案:

答案 0 :(得分:1)

您可以如下使用简单的window函数

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._

def commonWindowSpec(colName: String) = Window.partitionBy(colName)

df.select(col("eid"), count("salary").over(commonWindowSpec("salary")).as("levelCount"), count("location").over(commonWindowSpec("location")).as("areacount")).show(false)

它与您在配置单元sql中使用查询的条件几乎相同。

您应该获得以下输出

+----+----------+---------+
|eid |levelCount|areacount|
+----+----------+---------+
|1008|3         |1        |
|1009|3         |3        |
|1010|3         |3        |
|1003|1         |1        |
|1006|1         |3        |
+----+----------+---------+

我希望答案会有所帮助

答案 1 :(得分:0)

我遇到了同样的问题,我在下面的代码中解决了该问题:

public Dataset<Row> frequencyValuesAnalysisWOLim(Dataset<Row> dataSet, String attribute) {
    return dataSet.groupBy(col(attribute)).agg(size(collect_list(attribute))
            .as("count")).select(col(attribute), col("count")).orderBy(col("count").desc());
}