问题描述
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