【问题标题】:Joined values don't match?连接的值不匹配?
【发布时间】: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)。你确定你捕捉到了所有的警告和错误吗?

标签: sql join parquet impala


【解决方案1】:

试试这个

select * from test1 left outer join test2 on test1.foo=test2.foo

【讨论】:

  • 正如我在倒数第二段中提到的,我尝试了相同的输出。我认为它可能忽略了一个使用 vs on 的用例。
  • 这很奇怪,但是尝试升级Impala的版本或使用不同的版本
【解决方案2】:

更新:这似乎是一个工程错误。谢谢大家的帮助和反馈

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 2012-02-17
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多