Hadoop 配置单元QL-在另一个表中包含键的子集行

Hadoop 配置单元QL-在另一个表中包含键的子集行,hadoop,hive,Hadoop,Hive,我想用TableB中出现的键来子集TableA的所有行 表- Idn X Y ... 12 * * 13 * * 14 * * 表B- Idn A B C ... 12 * * * 12 * * * 14 * * * 我想选择表A中的所有元素,其中键出现在表B中 以下SQL查询在配置单元中不起作用- select * from TableA where Idn in (select distinct Idn from TableB) a;

我想用TableB中出现的键来子集TableA的所有行

表-

Idn   X  Y ...
 12   *  *
 13   *  *
 14   *  *
表B-

Idn   A B C ...
 12   * * *
 12   * * *
 14   * * *
我想选择表A中的所有元素,其中键出现在表B中

以下SQL查询在配置单元中不起作用-

select * from TableA where Idn in (select distinct Idn from TableB) a;
我还有别的办法吗

可以在单个查询中完成吗

请注意,这两个表在Idn中都不必是唯一的。

类似于a的内容可以做到这一点:

SELECT * FROM TableA LEFT SEMI JOIN TableB on (TableA.Idn = TableB.Idn)

左半联接以一种有效的方式实现了不相关的IN/EXISTS子查询语义。从配置单元0.13开始,使用子查询支持IN/NOT IN/EXISTS/NOT EXISTS运算符,因此大多数连接不再需要手动执行。使用左半联接的限制是,只能在子句上的联接条件中引用右侧表,而不能在WHERE或SELECT子句等中引用右侧表。

实际上,这消除了中间表-SELECT a.*从表a内部联接选择不同的idn从表b中选择a.idn=b.idn。这是最好的方式吗?看起来这正是我想要的。我可以指出,这只需要1个Map Reduce作业,而等效的查询在a.Idn=b.Idn上从表a中选择a.*内部联接从表b中选择不同的Idn。Idn需要2。谢谢。干杯:是的,你是对的,在用于常规内部联接的MapReduce作业中,映射程序在两个表上运行,通过计算查询中的任何UDF并根据where子句过滤掉任何记录,从而发出需要联接的记录,从而产生更多的作业。