groupby不支持spark?

r7knjye2  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(577)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

三年前关门了。
改进这个问题
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真的不会有这样的问题吗?
如果我错了,请纠正我。提前多谢!!

rjzwgtxy

rjzwgtxy1#

按id对以下行进行分组时

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

spark应该如何知道应该推出哪一类产品?第一个,随机的,最后一个?
mysql在这一点上更为冷淡,因此它会返回找到的第一个。要模仿spark中的这种行为,只需使用“first(category)”作为列定义。

n7taea2i

n7taea2i2#

除非字段类别属于group by,否则无法投影该字段类别。如果您试图找到每个类别和id组合的最大值(val),那么请尝试

SELECT max(val), id, category FROM table GROUP BY id, category;

您希望从这个sql得到什么输出?

spark-sql> desc sparktest;
id      string  NULL
val     int     NULL
category        string  NULL
Time taken: 3.217 seconds, Fetched 3 row(s)

spark-sql> SELECT max(val), id, category FROM sparktest GROUP BY id, category;
Time taken: 0.412 seconds

我没有数据在我的表,但你是什么意思,不工作的Spark?

pbgvytdp

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 聚合函数:

SELECT id, MAX(rev)
FROM YourTable
GROUP BY id

从来没有这么简单,是吗?

我刚注意到你需要 content 列也是。
这是sql中非常常见的问题
实际上,stackoverflow社区创建了一个标签来处理这样的问题是很常见的:greatest-n-per-group。
答案中最简单的变体可能是:

SELECT * 
FROM t1 WHERE (id,rev) IN 
( SELECT id, MAX(rev)
  FROM t1
  GROUP BY id
)

相关问题