hadoop - 失败 : Error in semantic analysis: Column Found in more than One Tables/Subqueries

标签 hadoop hive

CREATE EXTERNAL TABLE old_events
(day STRING, foo STRING, count STRING, internal_id STRING)
PARTITIONED BY (ds string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '${INPUT}';

CREATE EXTERNAL TABLE events
(internal_id, foo STRING, count STRING)
PARTITIONED BY (ds string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '${OUTPUT}';

INSERT OVERWRITE TABLE events
SELECT e2.internal_id, e2.foo, count(e1.foo)
FROM old_events e2
LEFT OUTER JOIN old_events e1
ON e1.foo = e2.foo
WHERE e1.event = 'event1'
AND e2.event = 'event2'
AND ds = date_sub('${DAY}',1)
GROUP BY e2.internal_id, e2.foo;

失败:语义分析错误:在多个表/子查询中找到列 ds

添加获取当前日期的 ds 变量时出现此错误。 我如何使用上述脚本实现日期分区。

最佳答案

您需要在 WHERE 子句中为 ds 添加别名。例如,ds = date_sub('${DAY}',1)e2.ds = date_sub('${DAY}',1)

为了澄清您的问题,这里有一个更小的示例,它显示了相同的行为

CREATE EXTERNAL TABLE example
(a INT, b INT)
LOCATION '${OUTPUT}';

SELECT *
FROM example e1
JOIN example e2
  ON e1.a = e2.a
WHERE b = 5;

这会产生同样的错误:

FAILED: SemanticException Column b Found in more than One Tables/Subqueries

问题是 b 列存在于别名为 e1e2example 中。你和我可能都知道,如果你在 a 列上加入 example 本身,那么 e1.be2.b 相同 所以它不需要别名,但是 Hive 不知道这个所以你需要选择一个来消除任何歧义。 b 是否为分区列在这里并不重要。

关于hadoop - 失败 : Error in semantic analysis: Column Found in more than One Tables/Subqueries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16609566/

相关文章:

java - Hadoop 中的默认 Record Reader,全局或本地字节偏移量

hadoop - 强制HDFS将 block 写入特定主机

Hadoop MapReduce 遍历 reduce 调用的输入值

sql-server - Hive CTE,我可以将值查询为表吗?

jdbc - 从 Java 访问 Hive 数据

hadoop - HIVE ODBC - 故障转移

r - 如何使用 Kerberos keytab 通过 R 连接 HIVE?

java - 是否可以使用Java将卡夫卡消费者收到的输出写入文件

hadoop - 如何在不同节点集群中调度hadoop map任务

hadoop - Presto查询引发错误-执行SELECT时StageStateMachine NullPointer *