蜂巢扫描并在一个查询中选择
Posted
技术标签:
【中文标题】蜂巢扫描并在一个查询中选择【英文标题】:hive scan and select in one query 【发布时间】:2018-03-12 05:58:49 【问题描述】:我有一个蜂巢桌,比如emp_details(name, dept)
。
在此表中,我需要检查是否存在带有dept = ‘a’
的记录,然后选择这些记录。如果没有找到这样的记录,那么只有我会选择带有dept = ‘b’
的记录。源数据具有'a'
或'b'
作为dept
值,我的结果集将包含'a'
或'b'
而不是两者。
问题是我必须只使用一个配置单元查询来解决这个问题。
【问题讨论】:
【参考方案1】:计算 a_exist 标志并将其用于过滤:
select name, dept
from
(select name,
dept,
(count(case when dept='a' then 1 end) over()>0) as a_exist
from test_a
)a
where (a_exist and dept='a') --only a if exists
or ((NOT a_exist)and dept='b') --return b if a not exists
;
【讨论】:
谢谢,但您的解决方案是根据名称对数据进行分区,然后取第一行。如果我有多个具有相同名称的条目,它会很好用,但如果名称具有唯一值,则会给我带来麻烦。例如,解决方案适用于数据集 ('abc', 'a'), ('abc', 'b');但是在 ('abc', 'a'), ('def', 'b') 时会产生问题。我的问题中所需的结果集是('abc','a')。 --select name, dept from (select name, dept, row_number() over (partition by e.name order by case e.dept when 'a' then 1 when 'b' then 2 end) rn from emp_details e) e where e.rn = 1;。如果我在某个地方错了,请纠正我。 @Sandeep 那么,如果存在任何 dept=a,您根本不需要任何行 dept='b' 吗?请提供源数据和结果示例。 源数据集 ('abc', 'a'), ('def', 'a'), ('ghi', 'b'), ('jkl', 'a') 结果集('abc', 'a'), ('def', 'a'), ('jkl', 'a') 因为在数据中找到了 'a',如果在数据中没有找到 'a'然后任何行只给我输出('ghi','b')'a'或'b'将出现在o / p中。让我知道是否清楚。以上是关于蜂巢扫描并在一个查询中选择的主要内容,如果未能解决你的问题,请参考以下文章