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. 十年WEB技术发展历程

    一个小分享,知识有限,抛砖引玉. ajax 03年的时候我上六年级,那时候网吧刚在小县城的角落萌生.传奇,大话西游第一代网游一时风靡.我抱着试一试的心态给了网吧老板两块钱想申请个号玩玩,然后接下来的一 ...

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

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

  3. bat遍历当前目录下的文件,批量重命名

    @echo off setlocal enabledelayedexpansion for %%x in (*) do ( if not "%%x"=="demo.bat ...

  4. ChemDraw 15出现安装异常如何处理

    化学绘图软件ChemDraw最近更新了,更新后的是2015版本,ChemDraw Professional 15是其中组件之一.一些用户朋友在使用ChemDraw 15的过程中由于对软件的不了解往往会 ...

  5. OpenCV学习笔记五:opencv_legacy模块

    opencv_legacy,顾名思义,该模块是用于兼容以前的opencv代码而设立的. 如果你希望用最新的opencv代码和特性,请勿使用该模块.

  6. pyhon多进程知识整理

    多进程概要: 在Unix/Linux下,可以使用fork()调用实现多进程. 要实现跨平台的多进程,可以使用multiprocessing模块. 进程间通信是通过Queue.Pipes等实现的. 要让 ...

  7. gridgroup行内编辑删除

    Ext.define('Task', { extend: 'Ext.data.Model', idProperty: 'taskId', fields: [ { name: 'projectId', ...

  8. 前端Js传递数组至服务器端

    $("#delete").click(function () { var ID = ""; var ary = []; var bb = document.ge ...

  9. 数据类型比较:Long和BigDecimal

    1.基本类型: 基本类型可以用:">" "<" "==" 2.基本类型包装类:(对象类型) 2.1 Long 型: 要比较两个L ...

  10. 如何用 JavaScript 控制 Arduino?

    Arduino 运行 C 语言,而主控端运行 JavaScript,一次要编写和维护两种程序.既然浏览器和服务器都用 JavaScript,若 Arduino 也能用 JavaScript 控制,那岂 ...