Эти сложные демонстрации настолько ясны, чтобы знать, как написать внутреннее соединение и левое соединение. Огромное спасибо!

оединиться к документации поскольку Hive поощряет использование неявных объединений, т.е.Это эквивалентно

SELECT * 
FROM table1 t1, table2 t2, table3 t3 
WHERE t1.id = t2.id AND t2.id = t3.id AND t1.zipcode = '02535';

или выше будет возвращать дополнительные записи?

SELECT t1.*, t2.*, t3.*
FROM table1 t1
INNER JOIN table2 t2 ON
  t1.id = t2.id 
INNER JOIN table3 t3 ON
  t2.id = t3.id
WHERE t1.zipcode = '02535'

Не всегда. Ваши запросы эквивалентны. Но без

Ответы на вопрос(1)

Решение Вопроса

 WHERE t1.id = t2.id AND t2.id = t3.idОбновить:CROSS JOIN.

Это интересный вопрос, и я решил добавить демо. Давайте создадим две таблицы:

 а также

A(c1 int, c2 string)Загрузить данные:B(c1 int, c2 string).

Проверьте данные:

insert into table A
 select 1, 'row one' union all
 select 2, 'row two';

insert into table B
 select 1, 'row one' union all
 select 3, 'row three';

Проверьте перекрестное соединение (неявное соединение без

hive> select * from A;
OK
1       row one
2       row two
Time taken: 1.29 seconds, Fetched: 2 row(s)
hive> select * from B;
OK
1       row one
3       row three
Time taken: 0.091 seconds, Fetched: 2 row(s)

 трансформируется в крест):whereПроверьте внутреннее соединение (неявное соединение с

hive> select a.c1, a.c2, b.c1, b.c2 from a,b;
Warning: Map Join MAPJOIN[14][bigTable=a] in task 'Stage-3:MAPRED' is a cross product
Warning: Map Join MAPJOIN[22][bigTable=b] in task 'Stage-4:MAPRED' is a cross product
Warning: Shuffle Join JOIN[4][tables = [a, b]] in Stage 'Stage-1:MAPRED' is a cross product

OK
1       row one 1       row one
2       row two 1       row one
1       row one 3       row three
2       row two 3       row three
Time taken: 54.804 seconds, Fetched: 4 row(s)

 работает как ВНУТРЕННИЙ):whereПопробуйте выполнить левое соединение, добавив

hive> select a.c1, a.c2, b.c1, b.c2 from a,b where a.c1=b.c1;
OK
1       row one 1       row one
Time taken: 38.413 seconds, Fetched: 1 row(s)

 к где:OR b.c1 is nullКак видите, мы снова получили внутреннее соединение.

hive> select a.c1, a.c2, b.c1, b.c2 from a,b where (a.c1=b.c1) OR (b.c1 is null);
OK
1       row one 1       row one
Time taken: 57.317 seconds, Fetched: 1 row(s)

 игнорируетсяor b.c1 is nullВ настоящее время

 безleft join а такжеwhere пункт (преобразованный в CROSS):ONКак видите, мы снова получили крест.

 select a.c1, a.c2, b.c1, b.c2 from a left join b;
OK
1       row one 1       row one
1       row one 3       row three
2       row two 1       row one
2       row two 3       row three
Time taken: 37.104 seconds, Fetched: 4 row(s)

Попробуйте присоединиться к

 оговорка и безwhere (работает как ВНУТРЕННИЙ):ONМы получили ВНУТРЕННЕЕ присоединение

select a.c1, a.c2, b.c1, b.c2 from a left join b where a.c1=b.c1;
OK
1       row one 1       row one
Time taken: 40.617 seconds, Fetched: 1 row(s)

Попробуйте присоединиться к

 оговорка и безwhere+ попробуйте разрешить нули:ONСнова получил ВНУТРЕННИЙ. или же

 select a.c1, a.c2, b.c1, b.c2 from a left join b where a.c1=b.c1 or b.c1 is null;
OK
1       row one 1       row one
Time taken: 53.873 seconds, Fetched: 1 row(s)

 игнорируетсяb.c1 is nullОсталось присоединиться к

 пункт:onДа, это правда, левый присоединиться.

hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1;
OK
1       row one 1       row one
2       row two NULL    NULL
Time taken: 48.626 seconds, Fetched: 2 row(s)

Осталось присоединиться к

 (получил ВНУТРЕННИЙ):on + whereМы получили ВНУТРЕННЕЕ, потому что ГДЕ не допускает NULL.

hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1 where a.c1=b.c1;
OK
1       row one 1       row one
Time taken: 49.54 seconds, Fetched: 1 row(s)

Оставить соединение с где + разрешить нули:

Да, это осталось присоединиться.

hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1 where a.c1=b.c1 or b.c1 is null;
OK
1       row one 1       row one
2       row two NULL    NULL
Time taken: 55.951 seconds, Fetched: 2 row(s)

Заключение:

Неявное соединение работает как INNNER (с where) или CROSS, если без предложения WHERE.

Левое объединение может работать как CROSS, если без ON и без WHERE, также может работать как INNER, если предложение WHERE не допускает пустые значения для правой таблицы.Лучше использовать синтаксис ANSI, потому что он самоочевиден и легко понять, как вы ожидаете, что он будет работать. Неявные или левые объединения, работающие как INNER или CROSS, сложны для понимания и очень подвержены ошибкам.Я наконец вернулся к этому, когда я подошел к более сложным запросам. Очень классная документация о поведении.
 Xiao24 февр. 2018 г., 11:03
Являются ли неявные объединения Hive всегда внутренними соединен
 data princess16 нояб. 2017 г., 17:36
Эти сложные демонстрации настолько ясны, чтобы знать, как написать внутреннее соединение и левое соединение. Огромное спасибо!

Ваш ответ на вопрос