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

问题描述 投票:0回答:2
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 变量时出现此错误。 我如何使用上面的脚本来实现日期分区。

hadoop hive
2个回答
10
投票

您需要在

ds
子句中为
WHERE
添加别名。例如,
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
同时存在于别名为
example
e1
e2
中。你和我可能知道,如果你将
example
本身加入到
a
列上,那么
e1.b
e2.b
相同,所以它不需要别名,但 Hive 不知道这一点,所以你需要选择一个别名消除任何歧义。这里
b
是否是分区列并不重要。


0
投票

我们在“列”架子上发现了多个字段。请确保年份(播出日期)是列架上的唯一字段,如本单元中所述。

© www.soinside.com 2019 - 2024. All rights reserved.