为什么Hive的DISTRIBUTE BY SORT BY仅在我将其作为sublselect写入时才起作用?

时间:2014-05-22 17:20:25

标签: hive

我已经确认了版本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)应该做的相反。这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

Hive通常假设UDF是无状态的" - 也就是说,记录传递给它的顺序无关紧要。因此,在第二个查询中,它会在排序发生之前在映射阶段执行udf。它按降序排列的事实可能仅仅是因为你的数据在输入文件中是如何的。

您的第一个查询强制在应用函数之前进行排序。

Put"解释"在查询之前查看执行计划。