Hadoop Join 与 Not In的实现 
(一)源数据与要实现的查询
1. 要实现的查询
select a.sid
,a.name
,b.course
,b.score
from Student a
join Score b
on a.SID = b.SID
left outer join Filter c
on a.name = c.name
where c.name is null
2. 本地源文件:以制表符为字段分隔符
    student.dat                        course.dat                         filter.dat
                                
 
(二)Hadoop join的实现思路
给每个数据源加上一个数字标记label,这样hadoop对其排序后同一个字段的数据排在一起并且按照label排好序了,于是直接将相邻相同key的数据合并在一起输出就得到了结果。
1、 map阶段:给表1和表2加标记,其实就是多输出一个字段,比如表一加标记为0,表2加标记为2;
2、 partion阶段:根据学号key为第一主键,标记label为第二主键进行排序和分区
3、 reduce阶段:由于已经按照第一主键、第二主键排好了序,将相邻相同key数据合并输出

(三)Streaming快速编程

1. mapper.py

#!/usr/bin/env python
import os
import sys,re def mapper():
ip = set() # 尽量不要声明global def load_Fil(file='dictlink'):
for line in open():
yield ip.add(line.strip()) def read_input(file):
filepath = os.environ["map_input_file"]
filename = re.findall('(.*).dat',os.path.split(filepath)[-1])[0]
for line in file:
if line.strip()=="":
continue
fields = line[:-1].split("t")
sno = fields[0]
if filename == 'student':
name = fields[1]
yield (sno,'0',name)
elif filename == 'course':
courseno = fields[1]
grade = fields[2]
yield (sno,'1',courseno,grade)
for k in load_Fil():
pass data = read_input(sys.stdin)
for field in data:
if len(field) == 3 and field[2] not in ip:
print 't'.join((field[0],field[1],field[2]))
elif len(field) == 4:
print 't'.join((field[0],field[1],field[2],field[3])) if __name__=='__main__':
mapper()

2. reduce.py

#!/usr/bin/env python
import sys lastsno = ''
for line in sys.stdin:
if line.strip()=="":
continue
fields = line.strip().split('t')
sno = fields[0]
if sno != lastsno:
name=''
if fields[1] == '0':
name = fields[2]
elif sno==lastsno:
if fields[1] == '1':
courseno = fields[2]
grade = fields[3]
#sys.stderr.write('(4) ****:%s||%sn'%(courseno,grade))
if name:
print 't'.join((lastsno,name,courseno,grade))
lastsno = sno
#sys.stderr.write('(6) *****%s=%s*******n'%(lastsno,sno))

(四)准备文件

1. 准备好本地文件

2. 将本地文件student.dat与course.dat 上传到云梯目录

hadoop fs -mkdir /group/alidw/ali-log/wfs/join
hadoop fs -put student.dat course.dat /group/alidw/ali-log/wfs/join

(五)设置Streaming参数并执行

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-0.19.1-dc-streaming.jar
-D stream.num.map.output.key.fields=2
-D num.key.fields.for.partition=1
-D mapred.map.tasks=10
-D mapred.reduce.tasks=3
-D mapred.job.name="join_test"
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
-input /group/alidw/ali-log/wfs/join/course.dat
-input /group/alidw/ali-log/wfs/join/student.dat
-output /group/alidw/ali-log/wfs/joinput
-mapper mapper.py
-reducer reduce.py
-file /home/dwapp/fusen.wangfs/MR/join/mapper.py
-file /home/dwapp/fusen.wangfs/MR/join/reduce.py
-cacheFile /group/alidw/ali-log/wfs/join/filter.dat#dictlink

(六)最后的输出:为了便于查看,你也可以创建外部表

[dwapp@dw-yuntigw-64 join]$ hadoop fs -cat /group/alidw/ali-log/wfs/joinput/part-00000
001 Jack Language 90
001 Jack Math 80
[dwapp@dw-yuntigw-64 join]$ hadoop fs -cat /group/alidw/ali-log/wfs/joinput/part-00001
002 Marry Language 95
002 Marry Math 82
[dwapp@dw-yuntigw-64 join]$ hadoop fs -cat /group/alidw/ali-log/wfs/joinput/part-00002
003 Nacy Language 80

(七)总结

1. 如果过滤表不大,数据过滤(如not in,not like等)应尽量放在map阶段来实现
2. 否则,过滤操作就在reduce阶段实现
3. 本文通过Streaming文件分发策略,来实现各个map的数据过滤
4. 重写reduce.py后,MapJoin & Left Semi Join & Left Outer Join 等亦可快速实现

Python Streaming实战2: Join的实现与数据过滤的更多相关文章

  1. 【python数据分析实战】电影票房数据分析(二)数据可视化

    目录 图1 每年的月票房走势图 图2 年票房总值.上映影片总数及观影人次 图3 单片总票房及日均票房 图4 单片票房及上映月份关系图 在上一部分<[python数据分析实战]电影票房数据分析(一 ...

  2. Python爬虫实战案例:取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  3. 【python数据分析实战】电影票房数据分析(一)数据采集

    目录 1.获取url 2.开始采集 3.存入mysql 本文是爬虫及可视化的练习项目,目标是爬取猫眼票房的全部数据并做可视化分析. 1.获取url 我们先打开猫眼票房http://piaofang.m ...

  4. selenium2 python自动化测试实战(回归测试)

    selenium2 python自动化测试实战 最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重 ...

  5. Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  6. Python接口测试实战4(上) - 接口测试框架实战

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  7. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  8. 【Python项目实战】Pandas:让你像写SQL一样做数据分析(一)

    1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...

  9. 万字长文,Python数据分析实战,使用Pandas进行数据分析

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

随机推荐

  1. 如何在GitHub上删除某个文件夹?

    步骤: (以删除.idea文件夹为例) git rm -r --cached .idea #--cached不会把本地的.idea删除 git commit -m 'delete .idea dir' ...

  2. spring cloud与K8S

    链接:https://www.zhihu.com/question/50806354/answer/139653085 spring cloud +docker 当然没有问题,只是当我们搭建集群实现高 ...

  3. apple touch icon 大小总结

    <!-- For Chrome for Android: --> <link rel="icon" sizes="192x192" href= ...

  4. ThinkPHP与EasyUI整合之三(searchbox):在datagrid中查询指定记录

    在datagrid中toolbar添加searchbox查询框,根据列范围查询数据,先看效果图: 1. searchbox采用easyui的Demo例子,再加以js扩展,根据datagrid中的列数据 ...

  5. java FTP 上传下载删除文件

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...

  6. List ArrayList LinkedList 集合三

    因为List是有顺序的说以API中定义了 方法来处理List Collections 接口:用于操作List集合有排序sort(list);查找int binarySearch(List,obj);c ...

  7. h5做移动应用开发部分技巧

    1.使用多种分别率设备:利用viewport标签<meta name="viewport" content="width=device-width, initial ...

  8. Android UI开发第二十七篇——实现左右划出菜单

    年前就想写左右滑动菜单,苦于没有时间,一直拖到现在,这篇代码实现参考了网上流行的SlidingMenu,使用的FrameLayout布局,不是扩展的HorizontalScrollView. 程序中自 ...

  9. hdu 4419 线段树 扫描线 离散化 矩形面积

    //离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...

  10. poj 3670(LIS)

    // File Name: 3670.cpp // Author: Missa_Chen // Created Time: 2013年07月08日 星期一 21时15分34秒 #include < ...