Hive 查询给出与 SQL 不同的结果

Hive Query Giving Different Results Than SQL

我在 MySQL 数据库中有两个表,分别为 'game' 和 'team'。它们具有以下形式:

game:
+-----+------+
| gid | temp |
+-----+------+
|   1 | 79   |
|   2 | 78   |
|   3 | 109  |
|   4 | 77   |
|   5 | 90   |
|   6 | 89   |
|   7 | 65   |
|   8 | 71   |
|   9 | 89   |
|  10 | 80   |
+-----+------+

team:
+-----+-------+-----+-----+
| gid | tname | ry  | py  |
+-----+-------+-----+-----+
|   1 | SF    |  92 | 247 |
|   1 | ATL   |  95 | 264 |
|   2 | JAC   | 119 | 279 |
|   2 | CLE   |  96 | 153 |
|   3 | PHI   | 306 | 119 |
|   3 | DAL   |  67 | 100 |
|   4 | NYJ   | 118 | 261 |
|   4 | GB    |  62 | 149 |
|   5 | IND   | 119 | 267 |
|   5 | KC    |  74 | 206 |
+-----+-------+-----+-----+

还有更多的专栏,但这些是相关的。我已经使用 Sqoop 将它们导出到 Hive(我在 运行 伪分布式模式下),我正在尝试 运行 一个简单的查询;但是,与 运行 在 MySQL 中进行相同查询相比,我得到的结果大不相同。

例如,在 Hive 中,如果我 运行 查询(在低于冰点的温度下获得每场比赛的平均码数)

SELECT tname, AVG(ry+py) as ypg FROM team INNER JOIN 
    (SELECT gid FROM game WHERE temp<=32) AS cold
    ON team.gid=cold.gid GROUP BY tname;

我明白了

OK
ARI 263.0
ATL 271.5
BAL 309.77777777777777
BUF 304.5
CAR 278.6666666666667
CHI 292.6333333333333
CIN 309.77272727272725
CLE 290.6666666666667
DAL 255.85714285714286
DEN 366.5
DET 327.44444444444446
GB  373.75471698113205
HOU 391.75
IND 303.9
JAC 302.0
KC  346.4782608695652
MIA 325.1666666666667
MIN 325.6666666666667
NE  358.5
NO  369.3333333333333
NYG 347.57142857142856
NYJ 310.27777777777777
OAK 326.7
PHI 344.3
PIT 359.969696969697
SD  337.14285714285717
SEA 289.45454545454544
SF  340.14285714285717
STL 452.0
TB  348.3333333333333
TEN 305.3076923076923
WAS 290.3333333333333
Time taken: 30.172 seconds, Fetched: 32 row(s)

然而,运行在 MySQL 中使用相同的查询给出

+-------+----------+
| tname | ypg      |
+-------+----------+
| ARI   | 339.7283 |
| ATL   | 347.1628 |
| BAL   | 304.5625 |
| BUF   | 305.1250 |
| CAR   | 333.7179 |
| CHI   | 313.3462 |
| CIN   | 316.9167 |
| CLE   | 301.1579 |
| DAL   | 356.4805 |
| DEN   | 357.8298 |
| DET   | 366.3509 |
| GB    | 372.9351 |
| HOU   | 334.9915 |
| IND   | 362.3732 |
| JAC   | 325.9444 |
| KC    | 339.1622 |
| MIA   | 318.6667 |
| MIN   | 341.0000 |
| NE    | 368.5614 |
| NO    | 408.4219 |
| NYG   | 370.2500 |
| NYJ   | 314.8788 |
| OAK   | 327.7143 |
| PHI   | 354.2619 |
| PIT   | 359.4565 |
| SD    | 352.2105 |
| SEA   | 349.8444 |
| SF    | 320.9744 |
| STL   | 348.1736 |
| TB    | 309.9310 |
| TEN   | 314.4222 |
| WAS   | 362.3548 |
+-------+----------+
32 rows in set (0.00 sec)

为什么这些不同?

事实证明,Hive查询returns正确的结果。这是因为 'game' table 中有许多缺失的温度,MySQL 被视为 0(因此包括在低于冰点温度下每场比赛的码数计算中)。