Hadoop Mapreducer两文件数据求交拼接

两份数据,若干行,若干列。均有相同一列,作为key。连接,完整显示两份数据。

data1.txt

zhangsan man    25      teacher
lisi    man     28      police
wangwu  man     26      student
guoxiao man     26      salesman
wangmeng        women   26      student
huangshi        women   28      programmer
zhouchu man     25      manager
yangchao        man     27      doctor

data2.txt

zhanghuan       liaoning        huludao
huangshi        liaoning        unknown
xutao   henan   luoyang
guoxiao shanxi  datong
zhangchao       yunnan  qujing
zhangsan        known   known
wangwu  henan   luoyang
zhouchu hubei   enshi
luopeng sichuan dazho

第一列为姓名,在每份数据里都是唯一的,为唯一键。

结果如下所示

huangshi        women   28      programmer      liaoning        unknown
guoxiao man     26      salesman        shanxi  datong
wangwu  man     26      student henan   luoyang
zhouchu man     25      manager hubei   enshi

Mapper

#!/bin/bash
function get_data_source()
{
        #local mapreduce_map_input_file=data2asdf.txt

        echo "${mapreduce_map_input_file}" | awk ‘{
                if ($1 ~ "data1")
                {
                        print "data1"
                }
                else if ($1 ~ "data2")
                {
                        print "data2"
                }
        }‘
        return 0
}

function filter()
{
        local data_source=`get_data_source`

        if [ "${data_source}" == "data1" ]
        then
                awk ‘BEGIN{
                        OFS = "\t"
                }{
                        print $0 ,1
                }END{
                }‘
        elif [ "${data_source}" == "data2" ]
        then
                awk ‘BEGIN{
                        OFS = "\t"
                }{
                        print $0, 2
                }END{
                }‘
        fi
}
filter

Reduce

#!/bin/bash
awk ‘BEGIN{
        OFS = "\t"
}{
        if($NF == 1)
        {
                print substr($0,1,length($0)-1) > "1.txt"
        }
        if($NF == 2)
        {
                print substr($0,1,length($0)-1) > "2.txt"
        }
}END{
}‘

awk ‘BEGIN{
        FS = "\t"
        OFS = "\t"
}{
        if(ARGIND == 1)
        {
                dict[$1] = $0
        }
        else if(ARGIND == 2)
        {
                if($1 in dict)
                {
                        print dict[$1], $2, $3
                }
        }
}END{
}‘ 1.txt 2.txt

总结:

streaming框架通过设置环境变量的方式给mapper、reducer程序传递配置信息。我们利用mapreducer_map_input_file这一环境变量,可以获得输入文件路径,这样可以区分Map读取的数据来自哪一个文件。根据数据来源文件的不同,分别为Map的输出数据加后缀标识符。这里有两个文件,加上1,2用于区分。

Reducer的输入数据,每一行最后都有后缀1,2。在每一个Reducer任务里面,根据后缀不同在当前工作目录下面,生成两个临时文件。这样对这两个文件,进行单机版的相同处理即可得到我们需要的交集。

原文地址:https://www.cnblogs.com/zwcoding/p/9269767.html

时间: 2024-10-31 00:36:40

Hadoop Mapreducer两文件数据求交拼接的相关文章

ray与triangle/quad求交二三事

引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做ray与quad的求交,发现方程里不仅有u和v,还有uv,没法变换成线性方程组的形式.本以为引擎中quad中四个点可以不共面,看过接口,不然,“不共面和退化的多边形不保证正确结果“.而后又有两个问题,一是,与一个quad求交比与两个三角形求交快吗?二是,如果前面的问题答案为否,即两个三角形更快,为何

Hadoop中的CRC数据校验文件

错误分析: 今天在A程序中生成了数据,然后将A结果数据作为B的输入数据,在查看A结果数据时候,发现有一条数据不符合规则,遂将其删除,删除后执行B程序则报错.尝试打断点,发现程序连map过程都不执行,到了 job.waitForCompletion(true);这一步之后直接就报错了,错误信息为: org.apache.hadoop.fs.ChecksumException: Checksum error: file:/E:/hdpSapce/web_log/out/golden/part-m-0

拼接上传文件数据

学会拼接上传文件数据. { * 有些服务器可以在上传文件的同时,提交一些文本内容给服务器 * 典型应用: <1>新浪微博: 上传图片的同时,发送一条微博信息! <2>购物评论: 购买商品之后发表评论的时候图片+评论内容! 多文件上传的数据格式3 { Content-Type: multipart/form-data; boundary=boundary // ------ 以下内容,是提供给服务器的二进制数据格式 --boundary\r\n Content-Disposition

Java学习-013-文本文件读取实例源代码(两种数据返回格式)

此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 1.读取的文本文件内容以一维数组[LinkedList<String>]的形式返回,源代码如下所示: 1 /** 2 * @function 文本文件操作:读取数据 3 * 4 * @author Aaron.ffp 5 * @version V1.0.0: autoUISelenium main.java.aaron.java.tools FileUtils.java txtRead, 201

【大数据系列】hadoop上传文件报错_COPYING_ could only be replicated to 0 nodes

使用hadoop上传文件 hdfs dfs -put  XXX 17/12/08 17:00:39 WARN hdfs.DFSClient: DataStreamer Exception org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/sanglp/hadoop-2.7.4.tar.gz._COPYING_ could only be replicated to 0 nodes instead of m

Hadoop对小文件的解决方案

小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中, 每一个object占用150 bytes的内存空间.所以,如果有10million个文件, 每一个文件对应一个block,那么就将要消耗namenode 3G的内存来保存这些block的信息.如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限. 控制小文件的方法有: 1.应用程序自己控制 2.arc

第十五讲.数据解析(XML与JSON两种数据解析)

一.XML数据解析 1.SAX:Simple API for XML.基于事件驱动的解析方式,逐行解析数据.(采用协议回调机制) NSXMLParser的解析方法: 1 #import "ViewController.h" 2 #import "Model.h" 3 4 @interface ViewController ()<NSXMLParserDelegate> 5 6 @property(nonatomic,strong)UITableView

Hadoop学习笔记之三 数据流向

http://hadoop.apache.org/docs/r1.2.1/api/index.html 最基本的: 1. 文本文件的解析 2. 序列文件的解析 toString会将Byte数组中的内存数据 按照字节间隔以字符的形式显示出来. 文本文件多事利用已有的字符处理类, 序列文件多事创建byte数组,然后将文件流中的数据复制到byte数组后进行解析. LineRecordReader... ... 这里首先需要了整个文件数据 的流动方向. MapReduce框架借助inputformat完

从Hadoop URL中读取数据

要从Hadoop文件系统中读取文件,一个最简单的方法是使用java.net.URL对象来打开一个数据流,从而从中读取数据.一般的格式如下: 1.      InputStream in = null; 2.  try { 3.       in = new URL("hdfs://host/path").openStream(); 4.       // process in 5.  } finally { 6.       IOUtils.closeStream(in); 7.  }