我已经确认了版本0.10和0.13的行为。
我有一个UDF,我添加了this annotation:@UDFType(stateful = true)
这可以按预期工作,因为MyFun
获取(user_id, track_started)
排序的元组track_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)
应该做的相反。这是一个错误吗?
答案 0 :(得分:1)
Hive通常假设UDF是无状态的" - 也就是说,记录传递给它的顺序无关紧要。因此,在第二个查询中,它会在排序发生之前在映射阶段执行udf。它按降序排列的事实可能仅仅是因为你的数据在输入文件中是如何的。
您的第一个查询强制在应用函数之前进行排序。
Put"解释"在查询之前查看执行计划。