Closed. This question needs debugging details。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

3年前关闭。



Improve this question




表格的设计是这样的:
id | val  |category
----------------
a1 |  10   | A
a1 |  30   | B
a1 |  20   | C
a2 |  5    | A
a2 |  7    | B
a2 |  2    | C
a3 | 50    | C
a3 | 60    | B
a3 | 90    | A

查询是这样的:
SELECT max(val), id, category FROM table GROUP BY id;

我确信此查询将在关系数据库(例如MySQL(在MySQL上经过测试),Oracle,MS SQL SERVER等)上正常工作。但是为什么它不能在Spark上运行?

我是说“Spark在使用groupBy方面有一些限制吗?”,我在mysql上测试了相同的表设计,效果很好,但在Spark上却给我一个错误,让我显示错误:
org.apache.spark.sql.AnalysisException: expression 'category' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.;
        at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$class.failAnalysis(CheckAnalysis.scala:38)

研究完此错误后,Spark基本上建议使用first()函数或first_value()函数作为解决方法。因此,我尝试了但没有得到预期的输出,或者我不确定100%的输出正确。
  • 是因为它是非关系的吗?
  • 我可以假定groupBy的上述特定情况不适用于其他非关系数据库吗?
  • 有人可以考虑解决方法吗?更好的替代方法?
  • 我做了一些研究,有人说“2.0以上的Spark版本不会有这样的问题”。我使用的是Spark 1.6版本,Spark 2.0不会有这样的问题真的吗?

  • 如果我在某处错了,请纠正我。在此先多谢!!

    最佳答案

    当您按ID对以下行进行分组时

    id | val   | category
    a1 |  10   | A
    a1 |  30   | B
    a1 |  20   | C
    

    spark应该如何知道应该将其分类?
    第一个,随机的,最后一个?

    MySQL在这方面更加冷静,因此它返回找到的第一个。
    要在Spark中模仿此行为,只需使用“first(category)”作为列定义。

    关于hadoop - groupBy无法在Spark上运行吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42954935/

    10-12 22:56
    查看更多