在此 HiveQL 查询中如何执行 map reduce?

How map reduce is being performed in this HiveQL query?

FROM (
  FROM pv_users
  SELECT TRANSFORM(pv_users.userid, pv_users.date)
  USING 'python mapper.py'
  AS dt, uid
  CLUSTER BY dt) map_output
INSERT OVERWRITE TABLE pv_users_reduced
SELECT TRANSFORM map_output.dt, map_output.uid
  USING 'python reducer.py'
  AS date, count;

map reduce 在这个查询中是如何工作的,"CLUSTER BY" 在这个查询中的意义是什么?

每个映射器将读取文件拆分,对它们的拆分做一些事情(例如 pre-aggregation 像 distinct)并生成 dt,uid 按 dt 分组和排序,因此不同的 dt 将被放入reducers 将在下一步中使用的不同文件。

Reducer 将读取由 mappers 准备的文件,因此具有相同 dt 的记录将由同一个 reducer 读取,因为记录是由 dt 分发并在 mapper 上排序的。 Reducer 将合并部分结果(来自映射器的文件)并进行一些 count 聚合。如果一些 dt 在同一个文件中,记录被排序,它减少了在 reducer 上完成的工作量。

cluster by dt = distribute by dt sort by dt

没有cluster by,两个reducer可能会收到相同的dt,这将无法正确执行计数,因为reducer彼此不了解并且不在它们之间共享数据,相同的dt将在不同的 reducer 上被部分计算,最终结果将包含多个具有相同 dt

的记录