蜂巢扫描并在一个查询中选择

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中。让我知道是否清楚。

以上是关于蜂巢扫描并在一个查询中选择的主要内容,如果未能解决你的问题,请参考以下文章

蜂巢计数查询无法完成它永远运行

从镶木地板表中选择在蜂巢中不返回任何内容

蜂巢上的火花 - 为啥不“选择*”产生火花应用程序/执行程序?

蜂巢地图加入。 Hive 选择更大的表存储在缓存中

蜂巢显示空值

技术分享 为啥 SELECT 查询选择全表扫描,而不走索引?