我有一个文本文件,格式如下:
ID,Name,Rating
1,A,3
2,B,4
1,A,4
我希望找到spark中每个ID的平均评分。这是我到目前为止的代码,但它一直给我一个错误:
val Avg_data=spark.sql("select ID, AVG(Rating) from table")
错误:org.apache.sapk.sql.AnalysisException:分组表达式序列为空,'table'。'ID'不是聚合函数。在窗口函数中包裹'(平均(CAST(table.'Rating'AS BIGINT))为'avg(Rating)')'.........
答案 0 :(得分:1)
AVG()
是一个聚合函数,所以你也需要
val Avg_data=spark.sql("select ID, AVG(Rating) as average from table group by ID")
您应该Avg_data
作为
+---+-------+
|ID |average|
+---+-------+
|1 |3.5 |
|2 |4.0 |
+---+-------+
答案 1 :(得分:0)
你需要使用group by子句和avg。
1.DataFrame df
+---+----+------+
| ID|Name|Rating|
+---+----+------+
| 1| A| 3|
| 2| B| 4|
| 1| A| 4|
+---+----+------+
2.将df作为临时表注册并使用GROUP BY和AVG()
编写查询df.registerTempTable("table")
val avg_data=spark.sql("select ID,avg(Rating) from table group by ID")
avg_data.show
+---+-----------+
| ID|avg(Rating)|
+---+-----------+
| 1| 3.5|
| 2| 4.0|
+---+-----------+