在spark-sql中执行SQL语句

时间:2018-03-25 17:06:26

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

我有一个文本文件,格式如下:

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)')'.........

2 个答案:

答案 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|
+---+-----------+