【问题标题】:Hive query with certain specific exclude conditions具有某些特定排除条件的 Hive 查询
【发布时间】:2017-05-31 13:21:23
【问题描述】:

我正在尝试构建一个仅执行以下功能或这些功能组合的配置单元查询。例如,功能包括

名称=“摘要”

name = "详细信息"

name1 = "车辆统计数据"

name1 = "加速度计"

我必须统计严格遵守上述条件的客户数量。例如,在下表中,不应计算客户“Joy”,因为他有 即使他在名称中同时包含“摘要”和“详细信息”以及名称1中的“车辆统计信息”和“加速度计”,也额外完成了名称中的“费用”。

同样,客户“Lan”不应该被计算在内,因为他在name1中还做了“超速”,不属于上述情况。

    customername    name        name1
    Joy             summary     vehicle stats
    Joy             details     accelerometer
    Joy             expenses    speeding
    Lan             summary     vehicle stats
    Lan             details     accelerometer   
    Lan             details     speeding
    Hana            details     accelerometer
    Hana            summary     vehicle stats

下表的计数必须为 1,因为只有 1 位客户 (Hana) 在名称和“车辆统计信息”中只做了“摘要”和“详细信息”,并且 名称中的“加速度计”1。

这是我目前的查询:

    select name, name1, count(distinct(customername))
    from table1
    where date_time between "2017-01-01 00:00:00" and "2017-01-10 00:00:00"
    group by name, name1
    having name in ('summary', 'details') 
    or name1 in ('vehicle stats', 'accelerometer')

任何建议都会很棒!

【问题讨论】:

  • 客户是否需要拥有所有 4 个属性,或者 1 个就足够了?

标签: sql hive hiveql


【解决方案1】:

第 1 部分

select      customername

from        table1

group by    customername

having      count 
            (
                case 
                    when    name  in ('summary', 'details') 
                         or name1 in ('vehicle stats','accelerometer')
                    then    1
                end
            ) > 0

        and count 
            (
                case 
                    when    name  not in ('summary', 'details') 
                         or name1 not in ('vehicle stats','accelerometer')
                    then    1
                end
            ) = 0

+--------------+
| customername |
+--------------+
| Hana         |
+--------------+

第 2 部分

select      name
           ,name1
           ,count(*)

from       (select      sort_array(collect_set(name))   as name
                       ,sort_array(collect_set(name1))  as name1

            from        table1

            group by    customername

            having      count 
                        (
                            case 
                                when    name  in ('summary', 'details') 
                                     or name1 in ('vehicle stats','accelerometer')
                                then    1
                            end
                        ) > 0

                    and count 
                        (
                            case 
                                when    name  not in ('summary', 'details') 
                                     or name1 not in ('vehicle stats','accelerometer')
                                then    1
                            end
                        ) = 0
            ) t

group by    name
           ,name1

+-----------------------+-----------------------------------+----+
|         name          |               name1               | c2 |
+-----------------------+-----------------------------------+----+
| ["details","summary"] | ["accelerometer","vehicle stats"] |  1 |
+-----------------------+-----------------------------------+----+

【讨论】:

    【解决方案2】:

    您也可以使用collect_set 仅检查这些列中的指定条目。

    select customername
    from table1
    where date_time between "2017-01-01 00:00:00" and "2017-01-10 00:00:00"
    group by customername
    having concat_ws(',',collect_set(name)) = 'summary,details'
    and concat_ws(',',collect_set(name1)) = 'vehicle stats,accelerometer'
    

    必须对来自collect_set 的串联输出进行排序 进行比较。

    【讨论】:

    • 这要求客户具备所有 4 个属性。另外,collect_set 不保证定单。
    • 是的@DuduMarkovitz .. 我提到他必须对 collect_set 输出进行排序以进行比较。我认为这个问题要求存在 all 4 个属性。
    • 评论说“你可能必须”,因此响应 - 你肯定必须对 collect_set 结果进行排序。代码应该是固定的。
    • @DuduMarkovitz .. 我编辑了答案的那部分。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-05-08
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多