【问题标题】:How map reduce is being performed in this HiveQL query?在这个 HiveQL 查询中如何执行 map reduce?
【发布时间】:2020-11-04 05:14:44
【问题描述】:
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" 在这个查询中的意义是什么?

【问题讨论】:

    标签: hadoop hive mapreduce hiveql hadoop-partitioning


    【解决方案1】:

    每个映射器将读取文件拆分,对其拆分做一些事情(例如预聚合,如 distinct)并生成 dt,uid 按 dt 分组和排序,因此不同的 dt 将被放入将被使用的不同文件中由reducers 进行下一步。

    Reducer 将读取由 mapper 准备的文件,因此具有相同 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的记录

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多