使用窗口函数时,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 语句中的复杂类型?的主要内容,如果未能解决你的问题,请参考以下文章