Hive 为什么蜂巢';如果我把它写成一个子集,那么我们只能按工作排序吗?

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,

我已经在版本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,
  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中添加了窗口和分析功能,这在某种程度上取代了它: