‎re‎duce端连接‎

来源:m-dot.com   作者:   发表时间:2020-02-17 05:48:03

reduce端连接则是利用了reduce的分区功能将stationid相同的分到同一个分区,在利用reduce的分组聚合功能,将同一个stationid的气象站数据和温度记录数据分为一组,reduce函数读取分组后的第一个记录(就是气象站的名称)与其他记录组合后输出,实现连接。例如连接下面气象站数据集和温度记录数据集。先用几条数据做分析说明,实际肯定不只这点数据。

气象站数据集,气象站id和名称数据表

StationId StationName

StationId TimeStamp Temperature

目标:是将上面两个数据集进行连接,将气象站名称按照气象站id加入气象站温度记录中最输出结果:

1~hangzhou ~20200211~9

1~hangzhou ~20200210~8

2~shanghai ~20200214~3

2~shanghai ~20200215~4

3~beijing ~20200216~6

3~beijing ~20200215~2

3~beijing ~20200217~8

(1) 两个maper读取两个数据集的数据输出到同一个文件

因为是不同的数据格式,所以需要创建两个不同maper分别读取,输出到同一个文件中,所以要用MultipleInputs设置两个文件路径,设置两个mapper。

(2) 创建一个组合键<stationed,mark>用于map输出结果排序。

组合键使得map输出按照stationid升序排列,stationid相同的按照第二字段升序排列。mark只有两个值,气象站中读取的数据,mark为0,温度记录数据集中读取的数据mark为1。这样就能保证stationid相同的记录中第一条就是气象站名称,其余的是温度记录数据。组合键TextPair定义如下

定义maper输出的结果如下,前面是组合键,后面是值。

<1,0> hangzhou

<1,1> 20200211~9

<1,1> 20200210~8

<2,0> shanghai

<2,1> 20200214~3

<2,1> 20200215~4

<3,0> beijing

<3,1> 20200216~6

<3,1> 20200215~2

<3,1> 20200217~8

(3)map结果传入reduce按stationid分区再分组聚合

map输出结果会按照组合键第一个字段stationid升序排列,相同stationid的记录按照第二个字段升序排列,气象站数据和记录数据混合再一起,shulfe过程中,map将数据传给reduce,会经过partition分区,相同stationid的数据会被分到同一个reduce,一个reduce中stationid相同的数据会被分为一组。假设采用两个reduce任务,分区按照stationid%2,则分区后的结果为

(4)分区之后再将每个分区的数据按照stationid分组聚合

<1,0> <Hangzhou, 20200211~9, 20200210~8>

<3,0> <Beijing, 20200216~6, 20200215~2, 20200217~8>

<2,0> <shanghai, 20200214~3, 20200215~4>

(5)将分组聚合后的数据传入reduce函数,将车站加入到后面的温度记录输出。

因为数据是经过mark升序排列的,所以每组中第一个数据就是气象站的名称数据,剩下的是改气象的温度记录数据,mark字段的作用就是为了保证气象站数据在第一条。所以读取每组中第一个value,既是气象站名称。与其他value组合输出,即实现了数据集的连接。

编辑:

未经授权许可,不得转载或镜像
© Copyright © 1997-2019 by m-dot.com all rights reserved