Hive 为什么蜂巢';如果我把它写成一个子集,那么我们只能按工作排序吗?
我已经在版本0.10和0.13中确认了这种行为 我添加了一个自定义项:Hive 为什么蜂巢';如果我把它写成一个子集,那么我们只能按工作排序吗?,hive,Hive,我已经在版本0.10和0.13中确认了这种行为 我添加了一个自定义项:@UDFType(stateful=true) 这与预期一样有效,例如,MyFun获取元组(用户id,track\u started)由track\u started ASC排序: SELECT user_id, MyFun(user_id, track_started) AS session_id, track_started, artist_id, artist_name, track_id,
@UDFType(stateful=true)
这与预期一样有效,例如,MyFun
获取元组(用户id,track\u started)
由track\u started ASC
排序:
SELECT
user_id,
MyFun(user_id, track_started) AS session_id,
track_started,
artist_id,
artist_name,
track_id,
track_name
FROM
(
SELECT
user_id,
track_started,
artist_id,
artist_name,
track_id,
track_name
FROM
track_listened_tiny
DISTRIBUTE BY
user_id
SORT BY
track_started
) a
但是,这并不是:
SELECT
user_id,
MyFun(user_id, track_started) AS session_id,
track_started,
artist_id,
artist_name,
track_id,
track_name
FROM
track_listened_tiny
DISTRIBUTE BY
user_id
SORT BY
track_started
以这种方式编写时,
MyFun
在映射状态下进行计算,因此无法正确排序元组。这似乎与@UDFType(stateful=true)
应该做的事情相反。这是一个bug吗?Hive通常假定UDF是“无状态的”——也就是说,记录传递给它的顺序无关紧要。因此,在第二个查询中,它在进行排序之前,在映射阶段执行udf。事实上,它是按降序排列的,这可能是因为输入文件中的数据就是按降序排列的
第一个查询强制在应用函数之前进行排序
在查询前加上“解释”以查看执行计划。谢谢,这很有说服力。如果是这样,我会调查的。但我在UDF上有
@UDFType(stateful=true)
()。这仍然是一种预期的行为吗?确实是因为函数是在映射阶段求值的,但这似乎与@UDFType(stateful=true)
应该做的相反。在阅读了jira之后,您是对的,似乎将其标记为stateful应该会导致它在减速器中发生;如果没有,它可能是一个bug。我认为这种类型的逻辑最近可能没有得到太多的关注,因为在版本0.11中添加了窗口和分析功能,这在某种程度上取代了它: