【问题标题】:Executing SQL Statements in spark-sql在 spark-sql 中执行 SQL 语句
【发布时间】:2018-03-25 17:06:25
【问题描述】:

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

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' 不是聚合函数。将 '(avg(CAST(table.'Rating' AS BIGINT)) 包装为 'avg(Rating)')' 在窗口函数中............

【问题讨论】:

  • 那是什么错误?您可以通过添加错误消息来更新您的问题吗?
  • @eliasah 刚刚更新了。
  • 在查询末尾添加“按 ID 分组”

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


【解决方案1】:

AVG() 是一个聚合函数,所以你也需要group by

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

【讨论】:

  • 是的,刚刚想通了。谢谢!
  • 如果答案对您有帮助,那么您也应该考虑接受并投票 :) 谢谢@Skyhopper9
【解决方案2】:

您需要将 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|
+---+-----------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多