我有一个如下表。
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中编写类似的代码。
答案 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());
}