【问题标题】: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' 而不是两者。

问题是我必须只使用一个配置单元查询来解决这个问题。

【问题讨论】:

    标签: hive apache-spark-sql hiveql pyspark-sql


    【解决方案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中。让我知道是否清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多