【发布时间】: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 我在我的问题中添加了一个示例。抱歉,这是我第一次在 stackoverflow 上提问
-
好的。这实际上是有道理的 :-) 这是您识别可重复用户查询的方法