【发布时间】:2017-07-22 21:28:04
【问题描述】:
我的加入产生了我不理解的结果。
如果它很重要或相关,我会在 Impala 中使用 Parquet Tables。
我正在做的是:
create table test1(foo string, bar int) stored as parquet;
create table test2(foo string, bar int) stored as parquet;
insert into test1 values ("something1",1);
insert into test2 values ("something2",2);
检查以确保有效:
select * from test1;
给我输出:
+----------------------+
| foo | bar |
+----------------------+
| something1 | 1 |
+----------------------+
1 rows
还有
select * from test2;
给我输出:
+----------------------+
| foo | bar |
+----------------------+
| something2 | 2 |
+----------------------+
1 rows
到目前为止一切似乎都很好。但是现在当我尝试将这两个表加入
select * from test1 left outer join test2 using (foo);
我明白了:
+---------------------------------------------+
| foo | bar | foo | bar |
+---------------------------------------------+
| something1 | 1 | something2 | 2 |
+---------------------------------------------+
1 rows
这出乎意料。我希望输出是 something1、1、null、null。连接不应该只在 test1.foo = test2.foo 时发生吗?
我还尝试使用 test1.foo = test2.foo 上的语法连接以及内部连接来执行此操作,并看到了相同的结果。
有人可以向我解释一下这里发生了什么吗?我重新阅读了文档,但我不明白为什么会这样。
【问题讨论】:
-
你在做一个左外连接,你确定要内连接吗?您还使用了不匹配的列...因此使用外连接时的结果集
-
我想做一个左外连接。这是我在一个更大的数据集中观察到的东西的简化版本。试图用最简单和最小的 2 个表(每行 1 行)的数据集来复制问题。如前所述,如果我使用内连接,输出是相同的
-
我认为您过度简化了问题。如前所述,这是可笑的行为,表明数据库中存在错误。
-
这实际上是输入和输出。除非过度简化会导致这种可笑的行为,否则我也认为有些事情根本上是错误的。值得一提的是,在更大的数据集中,这种连接不匹配只会每几百万行发生一次
-
select * from test1 left outer join test2 using (foo)应该返回列foo, bar, bar;你应该“期待”(something1,1,null)。你确定你捕捉到了所有的警告和错误吗?