Hadoop之使用python实现数据集合间join操作
2016-03-17 11:38
316 查看
hadoop之steaming介绍
hadoop有个工具叫做steaming,能够支持python、shell、C++、PHP等其他任何支持标准输入stdin及标准输出stdout的语言,其运行原理可以通过和标准java的map-reduce程序对比来说明:
使用原生java语言实现Map-reduce程序
hadoop准备好数据后,将数据传送给java的map程序
java的map程序将数据处理后,输出O1
hadoop将O1打散、排序,然后传给不同的reduce机器
每个reduce机器将传来的数据传给reduce程序
reduce程序将数据处理,输出最终数据O2
借助hadoop streaming使用python语言实现Map-reduce程序
hadoop准备好数据后,将数据传送给java的map程序
java的map程序将数据处理成“键/值”对,并传送给python的map程序
python的map程序将数据处理后,将结果传回给java的map程序
java的map程序将数据输出为O1
hadoop将O1打散、排序,然后传给不同的reduce机器
每个reduce机器将传来的数据处理成“键/值”对,并传送给python的reduce程序
python的reduce程序将数据处理后,将结果返回给java的reduce程序
java的reduce程序将数据处理,输出最终数据O2
上面红色表示map的对比,蓝色表示reduce的对比,可以看出streaming程序多了一步中间处理,这样说来steaming程序的效率和性能应该低于java版的程序,然而python的开发效率、运行性能有时候会大于java,这就是streaming的优势所在。
hadoop之实现集合join的需求
hadoop是用来做数据分析的,大都是对集合进行操作,因此该过程中将集合join起来使得一个集合能得到另一个集合对应的信息的需求非常常见。
比如以下这个需求,有两份数据:学生信息(学号,姓名)和学生成绩(学号、课程、成绩),特点是有个共同的主键“学号”,现在需要将两者结合起来得到数据(学号,姓名,课程,成绩),计算公式:
(学号,姓名) join (学号,课程,成绩)= (学号,姓名,课程,成绩)
数据事例1-学生信息:
数据事例2:-学生成绩:
期待的最终输出:
实现join的注意点和易踩坑总结
如果你想写一个完善健壮的map reduce程序,我建议你首先弄清楚输入数据的格式、输出数据的格式,然后自己手动构建输入数据并手动计算出输出数据,这个过程中你会发现一些写程序中需要特别处理的地方:
实现join的key是哪个,是1个字段还是2个字段,本例中key是sno,1个字段
每个集合中key是否可以重复,本例中数据1不可重复,数据2的key可以重复
每个集合中key的对应值是否可以不存在,本例中有学生会没成绩,所以数据2的key可以为空
第1条会影响到hadoop启动脚本中key.fields和partition的配置,第2条会影响到map-reduce程序中具体的代码实现方式,第3条同样影响代码编写方式。
hadoop实现join操作的思路
具体思路是给每个数据源加上一个数字标记label,这样hadoop对其排序后同一个字段的数据排在一起并且按照label排好序了,于是直接将相邻相同key的数据合并在一起输出就得到了结果。
1、 map阶段:给表1和表2加标记,其实就是多输出一个字段,比如表一加标记为0,表2加标记为2;
2、 partion阶段:根据学号key为第一主键,标记label为第二主键进行排序和分区
3、 reduce阶段:由于已经按照第一主键、第二主键排好了序,将相邻相同key数据合并输出
hadoop使用python实现join的map和reduce代码
mapper.py的代码:
[AppleScript] 纯文本查看 复制代码
?
reducer的代码:
[AppleScript] 纯文本查看 复制代码
?
使用shell脚本启动hadoop程序的方法:
[AppleScript] 纯文本查看 复制代码
?
可以自己手工构造输入输出数据进行测试,本程序是验证过的。
更多需要注意的地方
hadoop的join操作可以分为很多类型,各种类型脚本的编写有所不同,其分类是按照key字段数目、value字段数目、key是否可重复来划分的,以下是一个个人总结的对照表,表示会影响的地方:
3、map和reduce脚本中key的获取
4、map和reduce脚本中每一条数据和上一条数据比较的方法key是否可重复如果数据源1可重复,标记为M;数据源2可重复标记为N,那么join可以分为:1*1、M*1、M*N类型
1*1类型:reduce中先记录第一个value,然后在下一条直接合并输出;
M*1类型:将类型1作为标记小的输出,然后每次遇见label=1就记录value,每遇见一次label=2就输出一次最终结果;
M*N类型:遇见类型1,就用数组记录value值,遇见label=2就将将记录的数组值全部连同该行value输出。value字段数目影响每次label=1时记录的数据个数,需要将value都记录下来
来源:http://www.crazyant.net/1112.html
hadoop有个工具叫做steaming,能够支持python、shell、C++、PHP等其他任何支持标准输入stdin及标准输出stdout的语言,其运行原理可以通过和标准java的map-reduce程序对比来说明:
使用原生java语言实现Map-reduce程序
hadoop准备好数据后,将数据传送给java的map程序
java的map程序将数据处理后,输出O1
hadoop将O1打散、排序,然后传给不同的reduce机器
每个reduce机器将传来的数据传给reduce程序
reduce程序将数据处理,输出最终数据O2
借助hadoop streaming使用python语言实现Map-reduce程序
hadoop准备好数据后,将数据传送给java的map程序
java的map程序将数据处理成“键/值”对,并传送给python的map程序
python的map程序将数据处理后,将结果传回给java的map程序
java的map程序将数据输出为O1
hadoop将O1打散、排序,然后传给不同的reduce机器
每个reduce机器将传来的数据处理成“键/值”对,并传送给python的reduce程序
python的reduce程序将数据处理后,将结果返回给java的reduce程序
java的reduce程序将数据处理,输出最终数据O2
上面红色表示map的对比,蓝色表示reduce的对比,可以看出streaming程序多了一步中间处理,这样说来steaming程序的效率和性能应该低于java版的程序,然而python的开发效率、运行性能有时候会大于java,这就是streaming的优势所在。
hadoop之实现集合join的需求
hadoop是用来做数据分析的,大都是对集合进行操作,因此该过程中将集合join起来使得一个集合能得到另一个集合对应的信息的需求非常常见。
比如以下这个需求,有两份数据:学生信息(学号,姓名)和学生成绩(学号、课程、成绩),特点是有个共同的主键“学号”,现在需要将两者结合起来得到数据(学号,姓名,课程,成绩),计算公式:
(学号,姓名) join (学号,课程,成绩)= (学号,姓名,课程,成绩)
数据事例1-学生信息:
学号sno | 姓名name |
01 | name1 |
02 | name2 |
03 | name3 |
04 | name4 |
学号sno | 课程号courseno | 成绩grade |
01 | 01 | 80 |
01 | 02 | 90 |
02 | 01 | 82 |
02 | 02 | 95 |
学号sno | 姓名name | 课程courseno | 成绩grade |
01 | name1 | 01 | 80 |
01 | name1 | 02 | 90 |
02 | name2 | 01 | 82 |
02 | name2 | 02 | 95 |
如果你想写一个完善健壮的map reduce程序,我建议你首先弄清楚输入数据的格式、输出数据的格式,然后自己手动构建输入数据并手动计算出输出数据,这个过程中你会发现一些写程序中需要特别处理的地方:
实现join的key是哪个,是1个字段还是2个字段,本例中key是sno,1个字段
每个集合中key是否可以重复,本例中数据1不可重复,数据2的key可以重复
每个集合中key的对应值是否可以不存在,本例中有学生会没成绩,所以数据2的key可以为空
第1条会影响到hadoop启动脚本中key.fields和partition的配置,第2条会影响到map-reduce程序中具体的代码实现方式,第3条同样影响代码编写方式。
hadoop实现join操作的思路
具体思路是给每个数据源加上一个数字标记label,这样hadoop对其排序后同一个字段的数据排在一起并且按照label排好序了,于是直接将相邻相同key的数据合并在一起输出就得到了结果。
1、 map阶段:给表1和表2加标记,其实就是多输出一个字段,比如表一加标记为0,表2加标记为2;
2、 partion阶段:根据学号key为第一主键,标记label为第二主键进行排序和分区
3、 reduce阶段:由于已经按照第一主键、第二主键排好了序,将相邻相同key数据合并输出
hadoop使用python实现join的map和reduce代码
mapper.py的代码:
[AppleScript] 纯文本查看 复制代码
?
[AppleScript] 纯文本查看 复制代码
?
[AppleScript] 纯文本查看 复制代码
?
更多需要注意的地方
hadoop的join操作可以分为很多类型,各种类型脚本的编写有所不同,其分类是按照key字段数目、value字段数目、key是否可重复来划分的,以下是一个个人总结的对照表,表示会影响的地方:
影响类型 | 影响的范围 |
key字段数目 | 1、启动脚本中num.key.fields.for.partition的配置2、启动脚本中stream.num.map.output.key.fields的配置 |
4、map和reduce脚本中每一条数据和上一条数据比较的方法key是否可重复如果数据源1可重复,标记为M;数据源2可重复标记为N,那么join可以分为:1*1、M*1、M*N类型
1*1类型:reduce中先记录第一个value,然后在下一条直接合并输出;
M*1类型:将类型1作为标记小的输出,然后每次遇见label=1就记录value,每遇见一次label=2就输出一次最终结果;
M*N类型:遇见类型1,就用数组记录value值,遇见label=2就将将记录的数组值全部连同该行value输出。value字段数目影响每次label=1时记录的数据个数,需要将value都记录下来
来源:http://www.crazyant.net/1112.html
相关文章推荐
- python ——使字典按添加顺序输出
- 抓取高速公路摄像照片
- python 类中的某个函数作为装饰器
- Python实现计算最小编辑距离
- python os模块 常用命令
- python如何一次性取出多个随机数
- python员工查询表
- python os模块详细介绍
- Python 数据分析:pandas 操作基础篇
- python的XML及json解析
- android 使用 ase执行python脚本
- java getBytes() | python bytearray()
- Python单元测试——深入理解unittest
- python子进程模块subprocess详解与应用实例 之三
- python子进程模块subprocess详解与应用实例 之二
- python子进程模块subprocess详解与应用实例 之一
- 大数据全栈式开发语言 – Python
- python正则表达式之使用规则
- [python]抽象方法
- 关于Python中数据对象的可变性