**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
三年前关门了。
改进这个问题
table的设计如下:
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、mssqlserver等等,但是为什么它不能在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版本不会有这样的问题”。我使用的是spark1.6版本,spark2.0真的不会有这样的问题吗?
如果我错了,请纠正我。提前多谢!!
3条答案
按热度按时间rjzwgtxy1#
按id对以下行进行分组时
spark应该如何知道应该推出哪一类产品?第一个,随机的,最后一个?
mysql在这一点上更为冷淡,因此它会返回找到的第一个。要模仿spark中的这种行为,只需使用“first(category)”作为列定义。
n7taea2i2#
除非字段类别属于group by,否则无法投影该字段类别。如果您试图找到每个类别和id组合的最大值(val),那么请尝试
您希望从这个sql得到什么输出?
我没有数据在我的表,但你是什么意思,不工作的Spark?
pbgvytdp3#
你不懂sql。问题与Spark无关。在标准sql中,不能选择不在group by中且在功能上不依赖group by列的列。这是因为通常每个组的列有一堆不同的值。mysql的非标准行为是从列返回一个值(如果您想要一个特定的值,并且它不是由聚合给定的,例如与其他列的最大值在同一行的值,那么您需要编写相应的sql查询。您的查询不是“在mysql上工作”。你刚好得到了那个结果(mysql可以为一个组从该列返回任何值。
“this query will work”和“it works perfectly”是什么意思?你认为它应该做什么?什么是“预期产出”?“不起作用”是什么意思?你不能说。
也许您希望将行中的类别放在具有最大值的组中
val
但这不是你的查询所要求的。正确的查询在sql select only rows with max value on a column接受的答案中进行了解释:乍一看。。。
你只需要一个
GROUP BY
带有MAX
聚合函数:从来没有这么简单,是吗?
我刚注意到你需要
content
列也是。这是sql中非常常见的问题
实际上,stackoverflow社区创建了一个标签来处理这样的问题是很常见的:greatest-n-per-group。
答案中最简单的变体可能是: