【发布时间】:2019-06-07 23:18:07
【问题描述】:
根据 Hive 的 documentation,它支持 WHERE 子句中的 NOT IN 子查询,前提是子查询是不相关的子查询(不引用主查询中的列)。
但是,当我尝试运行下面的简单查询时,我收到错误 FAILED: SemanticException Cartesian products are disabled for safety reasons.
-- sample data
CREATE TEMPORARY TABLE foods (name STRING);
CREATE TEMPORARY TABLE vegetables (name STRING);
INSERT INTO foods VALUES ('steak'), ('eggs'), ('celery'), ('onion'), ('carrot');
INSERT INTO vegetables VALUES ('celery'), ('onion'), ('carrot');
-- the problematic query
SELECT *
FROM foods
WHERE foods.name NOT IN (SELECT vegetables.name FROM vegetables)
请注意,如果我使用 IN 子句而不是 NOT IN 子句,它实际上可以正常工作,这令人困惑,因为在任何一种情况下查询评估结构都应该相同。
是否有解决此问题的方法,或者是否有其他方法可以根据查询中的值是否存在于另一个表中来过滤它们?
这是 Hive 2.3.4 btw,在 Amazon EMR 集群上运行。
【问题讨论】:
标签: join hive hiveql cross-join notin