向配置单元中的case语句添加子查询

时间:2019-04-05 08:04:47

标签: hive hiveql

希望您能提供帮助。我有下面的查询,其中有一个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,.....

1 个答案:

答案 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