Hive Query дает разные результаты, чем SQL
У меня есть две таблицы, называемые "игра" и "команда", в базе данных MySQL. Они имеют следующую форму:
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 |
+-----+-------+-----+-----+
Есть еще столбцы, но это соответствующие. Я экспортировал их в Hive (который я запускаю в режиме псевдораспределения) с помощью Sqoop, и я пытаюсь выполнить простой запрос; тем не менее, я получаю совершенно другие результаты, чем если бы я выполнял тот же запрос в 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)
Почему они разные?
1 ответ
Оказывается, запрос Hive возвращает правильный результат. Это произошло из-за того, что в таблице "игры" было несколько пропущенных температур, которые MySQL рассматривал как "0" (следовательно, включая подсчет ярдов за игру при температурах ниже нуля).