在此HiveQL查询中如何执行地图归约?

问题描述

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这样的pre-aggregation),并生成dt,uid(按dt分组和排序),因此将不同的dt放入不同的文件中,下一步由减速器消耗。

归约器将读取由映射器准备的文件,因此同一归约器将读取具有相同dt的记录,因为记录是由dt分发并在映射器上排序的。 Reducer将合并部分结果(来自映射器的文件)并进行一些count聚合。如果某些dt位于同一文件中,则记录将被排序,这将减少在reducer上要做的工作量。

cluster by dt = distribute by dt sort by dt

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

的记录

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...