使用窗口函数时,hive 是不是支持 PARTITION BY 语句中的复杂类型?

Posted

技术标签:

【中文标题】使用窗口函数时,hive 是不是支持 PARTITION BY 语句中的复杂类型?【英文标题】:Does hive support complex type in PARTITION BY statement when using window function?使用窗口函数时,hive 是否支持 PARTITION BY 语句中的复杂类型? 【发布时间】:2017-04-13 13:57:07 【问题描述】:

我已经在 GROUP BY 语句中成功使用了复杂类型(在我的例子中是 map)。 但是当我尝试在 PARTITION BY 语句中使用 map 时,我得到一个错误:

SELECT *, MIN(dt) OVER(PARTITION BY some_map) FROM some_table

FAILED: SemanticException 未能将 Windowing 调用分解为组。至少 1 个组必须仅依赖于输入列。还要检查循环依赖。潜在错误:分区表达式 (TOK_TABLE_OR_COL query_params) 不是可比较的表达式

那么 hive 是否支持 PARTITION BY 语句中的复杂类型? 如果没有,如果我需要保留所有其他列值(所以我不能执行 GROUP BY),我该怎么办?

我是什么意思?比如我有一张表user_queries

user_id|query_params      |result_position|dt
1      |'text':'query1' |0              |2017-04-01 10:00
1      |'text':'query1' |1              |2017-04-01 12:00
1      |'text':'query2' |0              |2017-04-01 13:00
2      |'text':'query1' |0              |2017-04-01 09:00

我执行这个查询:

SELECT
    user_id,
    query_params,
    position,
    MIN(dt) OVER(PARTITION BY user_id, query_params) AS dt
FROM user_queries

我想得到这个(查看第 2 行的 dt):

user_id|query_params      |result_position|dt
1      |'text':'query1' |0              |2017-04-01 10:00
1      |'text':'query1' |1              |2017-04-01 10:00
1      |'text':'query2' |0              |2017-04-01 13:00
2      |'text':'query1' |0              |2017-04-01 09:00

【问题讨论】:

无论是否可行,这样做似乎都不合理 @Dudu Markovitz 你能解释一下为什么吗?)例如,我有很多字段的地图。 GROUP BY 理解如果所有对应的相等键的值都相等,则两个映射是相等的。我不想枚举所有地图的值,这不合理吗? 类似于group by *(伪代码)。你能举个具体的例子吗? @Dudu Markovitz 我在我的问题中添加了一个示例。抱歉,这是我第一次在 *** 上提问 好的。这实际上是有道理的 :-) 这是您识别可重复用户查询的方法 【参考方案1】:
select  user_id
       ,query_params
       ,result_position

       ,min(dt) over
        (
            partition by    user_id
                           ,sort_array (map_keys    (query_params))
                           ,sort_array (map_values  (query_params))
        ) as min_dt

from    user_queries

【讨论】:

以上是关于使用窗口函数时,hive 是不是支持 PARTITION BY 语句中的复杂类型?的主要内容,如果未能解决你的问题,请参考以下文章

Hive 窗口与分析型函数

Hive碎碎念(2):分析函数和窗口函数

hive关于窗口函数的使用

Hive sql及窗口函数

hive窗口函数总结

Hive学习之路 (十五)Hive分析窗口函数 CUME_DIST和PERCENT_RANK