2

我对 MySQL 有一些经验,最近我不得不在 HIVE 上做一些工作。

查询的基本结构在两者之间非常相似,但是 HIVE 中的 GROUP BY 的工作方式似乎有点不同......因此我无法实现以前在 MySQL 中使用 GROUP BY 可以实现的功能。

以下是我的问题,假设我有一个包含 A、B、C 列的表,并且我想选择最大的行。B 列值按 A 列分组。我会这样做:

SELECT A, max(B) FROM myTable GROUP BY A

上面的代码可以在 HIVE 中正常工作。但是,如果我还想查看 C 列中的值,该值与最大值所在的行位于同一行中,该怎么办?B 值?在 MySQL 中,我可以这样做:

SELECT A, max(B), C FROM myTable GROUP BY A

但是在HIVE中我不能这样做。它抱怨 C 不在 GROUP BY 键中,但是如果我将 C 添加到 GROUP BY 中,结果完全不是我想要的。

那么在 HIVE 中选择这种期望结果的方法是什么?有人说在 C 列上使用 collect_set 可以解决问题,但我不知道 collect_set 是如何排序的,因此不知道要返回哪个元素......

4

2 回答 2

3

好的,我想通了...以下可以解决问题:

SELECT A, maxB, C FROM myTable JOIN
(SELECT A, max(B) as maxB FROM myTable GROUP BY A) temp
ON myTable.A = temp.A AND myTable.B = temp.maxB

事实证明,我必须在 HIVE 中编写更多代码才能获得与 MySQL 中仅一行代码相同的结果...... :(

于 2012-05-25T23:11:13.577 回答
0

在 MySQL 中,您只会得到一个随机的 C,这不是您所期望的。

参见 MySQL 的 SQL_MODE 以适当地让 MySQL 也拒绝这种模棱两可的代码。

(或使用 MIN(C),得到一个特定的)

于 2013-02-11T13:02:40.683 回答