Hadoop MapReduce自关联(单表关联)-案例

2023-05-16

案例:获取孙子和祖父母的列表
     【单表关联.txt】 
           child        parent
        Tom        Lucy
        Tom        Jack
        Jone        Lucy
        Jone        Jack
        Lucy        Mary
        Lucy        Ben
        Jack        Alice
        Jack        Jesse
        Terry        Alice
        Terry        Jesse
        Philip       Terry
        Philip       Alma
        Mark       Terry
        Mark       Alma

思路分析:
    Tom           Lucy/Jack
                  Lucy   Mary/Ben  
                  Jack   Alice/Jesse
    
    Jone          Lucy/Jack
                  Lucy   Mary/Ben  
                  Jack   Alice/Jesse
         1                                2
                    左表                                   右表                
   k-------------v    (孩子与父母)        k-------------v(父母与祖父母)
   parent      child                child        parent
       grandchild                        grandparent
  mapper:
          确定标识符,左右表
          <k2,v2>--> <parent,"1"+child>
  reducer:
          遍历value,做笛卡尔积
          <k3,v3>--> <grandchild,grandparent>

代码如下:

Mapper端:

package com.hyxy.hadoop.join.single;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class SingleJoinMapper extends Mapper<LongWritable, Text, Text, Text>{
	@Override
	protected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {
		/*
		 * 置空表头
		 */
		String line = value.toString();
		if(line.contains("child")||line.contains("parent")){
			return ;
		}
		/*
		 * 确定左右表和表关系标识
		 */
		//空格切分文件内容
		StringTokenizer st = new StringTokenizer(value.toString());
		String child = st.nextToken();//返回孩子字段
		String parent = st.nextToken();//返回父母字段
		//判断左表和右表的child
		if(child.compareTo("child")!=0){
			//标识1:孩子与父母关系
			context.write(new Text(parent), new Text("1"+"+"+child));
			//标识2:父母与祖父母
			context.write(new Text(child), new Text("2"+"+"+parent));
		}
	}
}

Reducer端:

package com.hyxy.hadoop.join.single;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/*
 * <>
 */
public class SingleJoinReducer extends Reducer<Text, Text, Text, Text>{
	List<String> grandchild = new ArrayList<String>();
	List<String> grandparent = new ArrayList<String>();
	private Text _key = new Text();
	private Text _value = new Text();
	@Override
	//只调用一次,做表头
	protected void setup(org.apache.hadoop.mapreduce.Reducer.Context context)throws IOException, InterruptedException {
		context.write("grandchild", "grandparent");
	}
	@Override
	protected void reduce(Text key, Iterable<Text> values,Context context)throws IOException, InterruptedException {
		//遍历value,讲元素添加到集合中
		for (Text value : values) {
			//获取行内容
			String line = value.toString();
			//判断字符串是否以指定的前缀开始,判断是否是左表
			if(line.startsWith("1")){
				//将截取到的内容添加到grandchild集合中
				grandchild.add(line.substring(2));
			}else{
				//将截取到的内容添加到grandparent集合中
					grandparent.add(line.substring(2));
			}
		}
		//笛卡尔积,遍历grandchild集合
		for (String  child: grandchild) {
			//遍历grandparent集合
			for(String parent: grandparent){
				//将遍历出的元素赋值给_key和_value
				_key.set(child);
				_value.set(parent);
				context.write(_key,_value);
			}
		}
		//清空集合
		grandchild.clear();
		grandparent.clear();
	}
}

Driver端:

package com.hyxy.hadoop.join.single;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import com.hyxy.hadoop.join.multi.MultiJoinDriver;
import com.hyxy.hadoop.join.multi.MultiJoinMapper;
import com.hyxy.hadoop.join.multi.MultiJoinReducer;

public class SingleJoinDriver {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		Configuration conf = new Configuration();
		Path outfile = new Path("file:///G:/SingleOut");
		FileSystem fs = outfile.getFileSystem(conf);
		if(fs.exists(outfile)){
			fs.delete(outfile,true);
		}
		Job job = Job.getInstance(conf);
		job.setJarByClass(SingleJoinDriver.class);
		job.setJobName("Single Demo");
		
		job.setMapperClass(SingleJoinMapper.class);
		job.setReducerClass(SingleJoinReducer.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		FileInputFormat.addInputPath(job, new Path("file:///G:/测试数据/单表关联/"));
		FileOutputFormat.setOutputPath(job, outfile);
		System.exit(job.waitForCompletion(true)?0:1);
	}

}

输出结果样式:

grandchild	grandparent
Tom	Alice
Tom	Jesse
Jone	Alice
Jone	Jesse
Tom	Ben
Tom	Mary
Jone	Ben
Jone	Mary
Philip	Alice
Philip	Jesse
Mark	Alice
Mark	Jesse

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hadoop MapReduce自关联(单表关联)-案例 的相关文章

  • 第二十三讲.从HadoopURL中读取数据

    视频 xff1a 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 视频笔记 从hadoop URL读取数据 static URL setURLStreamH
  • winform窗体

    一 winform介绍 WinForm xff0c 是 Net开发平台中对Windows Form的一种称谓 WinForm是窗体应用程序 xff0c 由若干个窗体应用组成 xff0c 基于C S架构 二 winform的使用 xff08
  • 赋予人工智能记忆的人,带你梳理深度学习核心算法

    新智元翻译 1 来源 xff1a Idsia 作者 xff1a J rgen Schmidhuber 翻译 xff1a 张巨岩 作者介绍 xff1a J rgen Schmidhuber 被称为是赋予人工智能记忆的人 xff0c 递归神经网
  • C++实现贪吃蛇游戏

    注意 xff1a 本代码是在VC 43 43 6 0环境下编译的 xff0c 在其他环境如codeblocks下运行可能会产生意想不到的问题 xff0c 请尽量使用VC xff01 最近由于小编闲着慌 xff0c 捣鼓了一个贪吃蛇游戏 xf
  • Win10正式版19044.2132(KB5020435)来啦!(附完整更新日志)

    微软发布了Win10正式版KB5020435 xff08 操作系统内部版本 19042 2132 19043 2132 和 19044 2132 xff09 xff0c 此次更新主要解决了某些类型的安全套接字层 xff08 SSL xff0
  • SOUI总结之皮肤说明

    皮肤说明 说明 框架自带的皮肤都是 skin sys XXXX开始 xff0c 自带的皮肤存放位置trunk soui sys resource theme sys res xff0c 图片和名称映射关系可以打开trunk soui sys
  • C++中逗号运算符

    今天测试代码的时候 xff0c 遇到一行代码出现了疑问 xff0c 原因是出现了自减运算符和逗号运算符 xff0c 这就涉及到一个顺序的问题 xff0c 于是写了一个C 43 43 小程序 xff0c 验证了一下这个想法 include u
  • PsExec的问题及其解决办法

    C gt PsExec exe 192 168 1 142 cmd PsExec v1 98 Execute processes remotely Copyright C 2001 2010 Mark Russinovich Sysinte
  • ubuntu 18.04安装protobuf

    今天需要安装protobuf 在网上搜了一篇教程 xff0c 但是篇幅太长 xff0c 于是对其进行简化一下 原文 1 96 96 96 git clone https github com protocolbuffers protobuf
  • 读取配置文件的程序

    时常会遇到需要从配置文件中读取一些信息 xff0c 这里就提供一个例子 xff0c 方便日后使用 xff1a span class token comment ini h span span class token macro proper
  • 命令行读取参数

    有时需要从命令读取一些输入 xff0c 这里找到一个方法 xff0c 怎么实现的没有仔细研究 xff0c 但是可用 cmdline h span class token comment Copyright c 2009 Hideyuki T
  • 如何在一个shell脚本中开启多个应用程序?

    之前在csdn上搜索 xff0c 提示用gnome terminal指令 xff0c 但是发现怎么都不好使 于是找到一种解决方案 span class token comment bin bash span span class token
  • 使用openCV播放视频 在视频中加入滑动条

    include 34 opencv2 highgui highgui hpp 34 include 34 opencv2 imgproc imgproc hpp 34 include lt iostream gt include lt fs
  • Linux下vscode无法查看定义?

    今天要用到vscode查到c 43 43 程序 但是发现vscode无法查看程序的定义 于是找了一下解决方法 vscode无法转到定义可能是因为没有安装插件 由于我需要使用C 43 43 所以我这里安装的是C 43 43 插件 第一步 第二
  • 冒泡排序的实现(基于顺序表)

    对于冒泡排序的含义以及图示表示 这里就不再赘述 这篇博客已经说的很明白了 添加链接描述 于是就用代码实现了一下基于顺序表的冒泡排序 因为一直看的时大话数据结构这本书 于是把上面介绍的三种实现方法都在代码中实现一下 具体实现与书中有一些出入
  • ambiguating new declaration of 问题的解决

    今天在运行代码的时候 一直在报这样的错误 ambiguating new declaration of int NewPartition seqlist int int 查看了许久 原来是头文件中的声明类型与函数实现的声明类型不一致造成的
  • opencv中的MatConstIterator,NAryMatIterator迭代器的使用

    第一个迭代器 MatConstIterator迭代器 使用迭代器计算一个三通道三维数组中 34 最长元素 34 这个代码实现过程中 照着书中的代码抄下来一直报错 后来在查阅代码的时候 发现了问题所在 具体已经在代码中标明了 include
  • 用python实现查询天气的功能

    附上代码 import urllib request import gzip import json print 39 天气查询 39 def get weather data city name 61 input 39 请输入要查询的城市
  • 1.Docker 安装

    安装 wget 命令 yum install wget 安装docker wget q O https get docker com sh O 下载并以指定的文件名保存 以 39 39 作为file参数 xff0c 那么数据将会被打印到标准
  • linux下sudo apt-get update 报Err http://security.ubuntu.com precise-security InRelease 等

    今天在进行linux更新的时候一直报错 尝试了很多办法都不行 于是找到一个方法 切实可行 以根用户运行 cd var lib apt lists rm rm var cache apt archives lock rm var lib dp

随机推荐

  • HTTP Authentication之Basic认证、Digest认证

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 109691608 前面说到 Fiddler 的QuickExec Filter
  • Qt学习笔记(5) — Qt 类库【C++】

    目录 一 Qt核心特点1 元对象系统2 信号与槽的关联方式 二 Qt全局定义 xff08 常用头文件 xff09 1 lt QtGlobal gt 头文件1 xff09 数据类型定义2 xff09 函数3 xff09 宏定义 三 容器类1
  • 【C++】STL学习小总结

    经过自学以及查找资料汇总的一些记录 STL概述 长久以来 xff0c 软件界一直希望建立一种可重复利用的东西 xff0c 以及一种得以制造出 可重复运用的东西 的方法 xff0c 从函数 functions xff0c 类别 classes
  • ssh连接云服务器失败,能ping通但是连接不上

    环境 xff1a 腾讯云服务器 远程工具 xff1a xshell 7 问题描述 使用xshell远程工具时 xff0c 输入云服务器地址 xff0c 输入用户名密码之后显示 Connection established To escape
  • cheom 修改文件权限

    Chmod命令主要用于修改 设置文件权限 chmod 修改文件权限主要有两种方式 xff1a 字母法与数字法 1 字母法 xff1a chmod u g o a 43 61 r w x 文件名 以上是chmod的用法 xff0c 每个括号是
  • 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)

    1 从布谷鸟的育雏到布谷鸟算法2 布谷鸟算法3 萊维飞行与公式 1 的深层含义4 附 xff1a CS算法求解函数最小值代码5 源码下载6 参考文献 1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝 xff0c 也不会育雏 xff0c 在春末
  • kubernetes容器网络接口(CNI) midonet网络插件的设计与实现

    相关原理概述 先来讲讲什么是CNI CNI xff08 容器网络接口 xff09 是一种操作容器网络规范 xff0c 包含方法规范 xff0c 参数规范等 CNI只关心容器的网络连接 xff0c 在容器创建时分配网络资源 xff0c 并在删
  • 驱动篇:字符设备驱动综合实例(一)(摘录)

    驱动篇 xff1a 字符设备驱动综合实例 xff08 一 xff09 1 按键的设备驱动 在嵌入式系统中 按键的硬件原理比较简单 通过一个上拉电阻将处理器的外部中断 或 GPIO 引脚拉高 电阻的另一端连接按钮并接地即可实现 如图 12 1
  • 安卓学习日记(一):了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)

    首先为了理解安卓系统是怎么工作的 xff0c 就先来看一下android的系统架构 xff0c 其架构大至可以分为四层 xff1a linux内核层 系统运行库层 应用框架层和应用层 xff0c 那就先说说这几层 1 linux内核层 xf
  • 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法

    说明 1 分享页更新后 xff0c 浏览器总是有缓存 xff0c 须手动清理才能加载修改后的CSS和JS xff0c 故在加载地址后动态添加一个随机数 xff08 或时间戳 xff09 来确保每次加载的文件都不同来消除缓存 2 在加载js文
  • 目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)

    文章目录 目标检测概述目标检测概述基础知识和术语 YOLOv1YOLOv2YOLOv3YOLOv4YOLOv5YOLOxYOLOv6YOLOv7YOLOv8对比 目标检测概述 目标检测概述 什么是目标检测 xff1f 滑动窗口 xff08
  • ROS机器人应用(1)—— 搭建ROS虚拟机环境

    文章目录 搭建ROS虚拟机环境1 连接小车wifi2 下载vmware虚拟机3 下载ubuntu系统镜像4 远程登录5 常见问题6 简单操作演示 搭建ROS虚拟机环境 1 连接小车wifi 小车开机后会发出wifi xff0c 我们可以使用
  • ROS机器人应用(6)—— 激光雷达建图和导航

    文章目录 一 激光雷达建图二 建图算法切换及其优缺点三 自主导航四 多点导航 一 激光雷达建图 小车开机 xff0c 连接WIFI xff0c 密码 xff1a dongguan 启动激光建图 xff08 服务端 xff09 span cl
  • 学习记录(一)

    ionic起步 首先 xff0c 网络上扒拉教程安装ionic xff1a https blog csdn net weixin 38299362 article details 79626812 如果是配合angular使用 xff0c
  • 嵌入式软件开发之Linux下C编程

    目录 前沿 Hello World xff01 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各
  • 信息加密(简单的字母转换)

    题目 在传递信息的过程中 xff0c 为了加密 xff0c 有时需要按一定规则将文本转换成密文发送出去 有一种加密规则是这样的 xff1a 1 对于字母字符 xff0c 将其转换成其后的第3个字母 例如 xff1a A D xff0c a
  • TCP协议与UDP协议详解

    TCP协议 TCP xff0c 即Transmission Control Protocol xff0c 传输控制协议 人如其名 xff0c 要对数据的传输进行一个详细的控制 TCP协议的特点 xff1a 有连接 xff0c 可靠传输 xf
  • C语言头文件相互包含的问题

    我深知前路风雨 xff0c 但我依然微笑前行 头文件相互包含的问题 问题 xff1a 头文件交叉包含是否会导致递归包含 xff0c 导致编译出错 xff1f 如果不会因为递归包含出错 xff0c 那么交叉包含是不是完全没问题 xff1f 1
  • 【51单片机STC89C52】DHT11温湿度传感器的使用

    目录 一 DHT11概述 数据传送逻辑 数据格式 通讯过程时序图 二 检测模块是否存在 时序逻辑分析 代码实现 三 读取温湿度数据 DHT11传输0的时序分析 DHT11传输1的时序分析 代码实现 四 串口打印 一 DHT11概述 数据传送
  • Hadoop MapReduce自关联(单表关联)-案例

    案例 xff1a 获取孙子和祖父母的列表 单表关联 txt child parent Tom Lucy Tom Jack Jone Lucy Jone Jack Lucy Mary Lucy Ben Jack Alice Jack Jess