【问题标题】:Error in executing two groupbys in sparkSQL在 spark SQL 中执行两个 group bys 时出错
【发布时间】:2014-09-23 09:40:26
【问题描述】:

我是 sparksql 的新手,我正在尝试用它来试验某些查询。

这是我要执行的查询

sqlContext.sql(SELECT id , category ,AVG(mark) FROM data GROUP BY id, category)

我在运行查询时没有得到正确的输出。

我得到的不是类别的实际值,而是 1,2,3。

我被这个奇怪的错误困扰了很长时间

但是当我做简单的选择语句和一组完美地工作时

sqlContext.sql(SELECT id , category  FROM data)

sqlContext.sql(SELECT id  ,AVG(mark) FROM data GROUP BY id)

怎么了? SPARKSQL 是不是跟多 group by 有关系。

现在我正在运行这个复杂的查询

sqlContext.sql(SELECT data.id , data.category, AVG(id_avg.met_avg) FROM (SELECT  id, AVG(mark) AS met_avg FROM data GROUP BY id) AS id_avg, data GROUP BY data.category, data.id)

这可行,但需要更长的时间来执行。

请帮忙

样本数据:

|id | category | marks  
| 1 |        a |  40  
| 2 |        b |  44 
| 3 |        a |  50  
| 4 |        b |  40  
| 1 |        a |  30 

输出应该是:

|id | category | avg  
| 1 |        a |  35  
| 2 |        b |  44 
| 3 |        a |  50  
| 4 |        b |  40  

【问题讨论】:

  • 您确实需要提供两件事:1. sample data 只需几列和几行就足够了,2. 该示例中的 expected result。我的直接猜测是您应该停止在这些查询中使用 ID,但如果没有这 2 项,我就无法判断
  • 样本数据ID |类别 |标记 1 |一个 | 40 2 |一个 | 44 1 |乙 | 50 2 |乙 | 40 2 |乙 | 30 输出应该是 id |类别 |平均 1 |一个 | 40 2 |一个 | 44 1 |乙 | 50 2 |乙 | 35
  • 您能否验证样本数据和预期结果 - 我对此问题进行了编辑,因为我不明白
  • 我编辑了问题,请检查一下
  • 这是我见过的最奇怪的“平均”方式。 5 行输入“​​平均”回到 5 行输出,但只有一个平均值是输出,所有其他都是未更改的原始输入。诡异的。 3 条输入线的平均值是 1 条输出线(a 类的平均值是 (40+50+30)/3 = 40;b 类的平均值也是 44+40/2 = 42。我建议您重新考虑问题。

标签: sql apache-spark


【解决方案1】:

请试试这个查询:

SELECT
      data.id
    , data.category
    , AVG(mark)
FROM data
GROUP BY
      data.id
    , data.category

基于此样本数据:

|id | category | marks  
| 1 |        a |  40  
| 2 |        b |  44 
| 3 |        a |  50  
| 4 |        b |  40  
| 1 |        a |  30 

输出将是这样的:

|id | category | avg  
| 1 |        a |  35  
| 2 |        b |  44 
| 3 |        a |  50  
| 4 |        b |  40  

并且,使用group by 无法生成以下预期行:

| 5 |        a |  30 

【讨论】:

  • 如果您将 ID 添加到该查询中,您将一无所获,因为每个 ID 都是唯一的,因此唯一 ID 上的“分组依据”将“平均”一行,因此每一行都只是对原始 ID 的模仿输入。这是不明智的,或者您没有清楚地表达自己 - 或者您没有掌握平均的概念和/或“分组依据”的作用。
  • no id 在这种情况下不是唯一的,我需要每个 id 和每个类别的平均值。这是我的用例
  • group by 将形成 ID 和 Category 的唯一 combinations。从我写这篇文章时显示的样本数据来看,这些独特的组合是:|1|a| |2|b| |3|一个| |4|b|所以你只能在结果中得到 4 行,而不是 5
  • 我认为这是 spark mail-archives.apache.org/mod_mbox/incubator-spark-user/… 中的一个错误
【解决方案2】:

这是 sparksql 中的一个错误。 尝试使用下一个版本。它是固定的。

我使用 spark-1.0.2 得到了正确的输出

它也适用于纯 scala 代码。尝试其中任何一个:)

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多