希望您能提供帮助。我有下面的查询,其中有一个case语句。
我想说:
如果该域位于另一个表中,则返回该域名,否则,将其标记为“其他”
我正在使用Hive并收到错误消息:
Unsupported SubQuery Expression 'cleandomain': Currently SubQuery expressions are only allowed as Where Clause predicates
还有其他方法可以实现相同目标吗?
SELECT *,
CASE
WHEN cleandomain IN (SELECT cleandomain
FROM keenek1.daily_top_doms) THEN cleandomain
ELSE 'other'
END AS status
FROM (SELECT hour,.....
答案 0 :(得分:1)
一种可能的解决方案是使用in_file(string str, string filename)函数。
将域列表放入文本文件中,每行一个域,txt文件。为此,您可以使用存储为文本的配置单元表,并在CASE语句中调用函数:
CASE
WHEN in_file(cleandomain,'file/path') THEN cleandomain
ELSE 'other'
END AS status
另一种解决方案是将域列表聚合到子查询中的数组中,使用交叉连接进行连接,并使用array_contains()。如果列表不是太大,这可能会更快:
with dom as (
SELECT collect_set(cleandomain) dom
FROM keenek1.daily_top_doms
)
select
case when array_contains(d.dom, s.cleardomain) then s.cleandomain
else 'other'
end as status
from (your query) s cross join dom d --one row cross join