php爷孙关系列表,【Mapreduce】利用单表关联在父子关系中求解爷孙关系

2023-05-16

首先是有如下数据,设定左边是右边的儿子,右边是左边的父母

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要求输出如下所示的爷孙关系,左边是右边的孙子,右边是左边的祖父母:

TomJesse

TomAlice

JoneJesse

JoneAlice

JoneBen

JoneMary

TomBen

TomMary

PhilipAlice

PhilipJesse

MarkAlice

MarkJesse

要利用Mapreduce解决这个问题,主要思想如下:

1、在Map阶段,将父子关系与相反的子父关系,同时在各个value前补上前缀-与+标识此key-value中的value是正序还是逆序产生的,之后进入context。

下图通过其中的Jone-Lucy Lucy-Mary,求解出Jone-Mary来举例

a4c15f16282aa16dd69fc65b816fd22b.png

2、MapReduce会自动将同一个key的不同的value值,组合在一起,推到Reduce阶段。在value数组中,跟住前缀,我们可以轻松得知,哪个是爷,哪个是孙。

因此对各个values数组中各个项的前缀进行输出。

可以看得出,整个过程Key一直被作为连接的桥梁来用。形成一个单表关联的运算。

c8fde85aea93cf508f075c975ddfdb1a.png

因此代码如下,根据上面的思想很容易得出如下的代码了,需要注意的是,输出流输入流都要设置成Text,因为全程都是在对Text而不是IntWritable进行操作:

import java.io.IOException;

import java.util.ArrayList;

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.Mapper;

import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.util.GenericOptionsParser;

public class MyMapReduce {

public static class MyMapper extends Mapper {

public void map(Object key, Text value, Context context)

throws IOException, InterruptedException {

String child = value.toString().split(" ")[0];

String parent = value.toString().split(" ")[1];

//产生正序与逆序的key-value同时压入context

context.write(new Text(child), new Text("-" + parent));

context.write(new Text(parent), new Text("+" + child));

}

}

public static class MyReducer extends Reducer {

public void reduce(Text key, Iterable values, Context context)

throws IOException, InterruptedException {

ArrayList grandparent = new ArrayList();

ArrayList grandchild = new ArrayList();

for (Text t : values) {//对各个values中的值进行处理

String s = t.toString();

if (s.startsWith("-")) {

grandparent.add(new Text(s.substring(1)));

} else {

grandchild.add(new Text(s.substring(1)));

}

}

//再将grandparent与grandchild中的东西,一一对应输出。

for (int i = 0; i < grandchild.size(); i++) {

for (int j = 0; j < grandparent.size(); j++) {

context.write(grandchild.get(i), grandparent.get(j));

}

}

}

}

public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

String[] otherArgs = new GenericOptionsParser(conf, args)

.getRemainingArgs();

if (otherArgs.length != 2) {

System.err.println("Usage: wordcount ");

System.exit(2);

}

Job job = new Job(conf);

job.setMapperClass(MyMapper.class);

job.setReducerClass(MyReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(Text.class);

// 判断output文件夹是否存在,如果存在则删除

Path path = new Path(otherArgs[1]);// 取第1个表示输出目录参数(第0个参数是输入目录)

FileSystem fileSystem = path.getFileSystem(conf);// 根据path找到这个文件

if (fileSystem.exists(path)) {

fileSystem.delete(path, true);// true的意思是,就算output有东西,也一带删除

}

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));

FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

System.exit(job.waitForCompletion(true) ? 0 : 1);

}

}

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

php爷孙关系列表,【Mapreduce】利用单表关联在父子关系中求解爷孙关系 的相关文章

  • 机器学习专业名词中英文对照

    activation 激活值 activation function 激活函数 additive noise 加性噪声 autoencoder 自编码器 Autoencoders 自编码算法 average firing rate 平均激活
  • 个人总结 - JS逆向解析

    目前加密的方式总结有下面几点 xff1a 对称加密 xff08 加密解密密钥相同 xff09 xff1a DES DES3 AES 非对称加密 xff08 分公钥私钥 xff09 xff1a RSA 信息摘要算法 签名算法 xff1a MD
  • Hadoop的读写流程

    HDFS的读流程 1 HDFS采用的是 一次写入多次读取 的文件访问模型 一个文件经过创建 写入和关闭之后就不需要改变 这一假设简化了数据一致性问题 xff0c 并且使高吞吐量的数据访问成为可能 2 client让NameNode获取该文件
  • Python中的迭代器与可迭代对象

    可迭代对象 xff08 Iterable xff09 与迭代器 xff08 Iterator xff09 是python中的重要概念 xff0c 两者容易被弄混淆 xff0c 这里来总结一下 for循环 我们通常用for循环遍历一个可迭代对
  • 计算机串口程序配置,串口设置软件 串口调试工具如何使用

    串口调试工具 可以用来调试 串口通信程序 这时 xff1a 串口调试工具 作为一端 xff0c 串口通信程序 作为另外一端 调试时 xff0c 一端发送 xff0c 另外一端接收 多机情况下 xff0c 用串口线 连接 2台电脑就可以了 注
  • EGO-PLANNER代码阅读(地图部分)

    plan env grid map cpp 最近由于多个比较实验的原故 xff0c 把ego planner及Fast planner中TOPO REPLAN的代码都分析了一遍 EGO主要是为了看gridmap的使用 TOPO Replan
  • vueRouter 的使用及实现

    前言 我们经常会在vue项目中用到 vueRouter xff0c 通过路由实现页面的跳转 xff0c 不同的url展示相应的页面或内容 那么前端的路由究竟是如何实现的呢 xff0c 首先让我们先来了解一下路由的基本知识吧 xff01 前端
  • 对象的删除

    obj deleteLater 删除一个对象时 也会解除它与父对象之间的关系 deleteLater 并没有将对象立即销毁 而是向主消息循环发送了一个event 下一次主消息循环收到这个event之后才会销毁对象 这样做的好处是可以在这些延
  • VNC共享剪切板,打开远程复制粘贴功能

    出现原因 xff1a 本地剪切文件向服务器粘贴 xff0c 发现没有粘贴内容 xff08 服务器端执行 xff09 1 打开任务管理器 xff0c 找到rdpclip exe 结束任务 2 任务管理器面板 xff0c 文件 新建任务 输入r
  • centos7怎么永久关闭防火墙

    1 命令行界面输入命令 systemctl status firewalld service 并按下回车键 2 然后在下方可度以查看得到 active xff08 running xff09 xff0c 此时说明防火墙已经被打开了 3 在命
  • Ubuntu18.04创建用户

    1 创建用户 Step1 创建用户 sudo useradd username m Step2 设置密码 sudo passwd username 在弹出来的提示窗口中设置密码即可 Step3 切换用 su username 2 删除用户
  • win10下安装Hadoop3.2.2

    因为Hadoop需要依赖java环境 xff0c 因此需要先安装JDK1 8 xff08 大于1 8版本的jdk需要收费 xff0c 因此很多厂家开发都是依赖与jdk1 8 hadoop当然也是啦 xff09 1 安装JDK1 8 下载JD
  • Ubuntu18.04离线安装pytorch_gpu版本教程

    由于没有网络 xff0c 只能离线安装 xff0c 下载对应的包 xff0c 进行安装 1 安装显卡驱动 xff1a 根据购买的显卡型号进行安装 下载地址 xff1a https www nvidia cn Download index a
  • ubuntu18.04 ssh拷贝密钥失败

    问题描述 xff1a 生成密钥拷贝到远程电脑命令ssh copy id root 64 远程电脑ip 失败 出现了 xff1a etc ssh ssh config line 52 Unsupported option rsaauthent
  • wget下载方法

    wget下载cudnn wget c O cudnn tar 下载链接地址 参考 xff1a https baijiahao baidu com s id 61 1715589159640466321 amp wfr 61 spider a
  • 世界坐标系与车辆坐标系转换

    坐标系 车辆坐标系与相机坐标系的转换关系图
  • git amend方法

    引用 xff1a https blog csdn net Flyfreelylss article details 126021281 1 场景 有时候我们代码已经提交 xff08 commit xff09 了 xff0c 发现需要追加几处
  • git branch

    Git创建本地分支 使用 git brach 命令可以新建一个分支 比如在main branch 就在main branch创建 git branch dev xxx git checkout dev xxx 根据已有分支直接创建新的分支
  • C语言四川麻将算法,四川麻将胡牌算法

    满意答案 四川麻将中基础牌型和杠一起计费 最后输赢为两项之和 基础牌型 格 与基本番数 xff1a 平胡 xff1a 普通的四个搭子一对将 如 xff1a 123 345 789万 234 66筒 1番 大对子 对子胡 xff1a 四个搭子
  • UML关系:继承(泛化)、实现、依赖、关联、聚合、组合的联系与区别

    分别介绍这几种关系 xff1a UML关系 xff1a 继承 xff08 泛化 xff09 实现 依赖 关联 聚合 组合的联系与区别 一 表示符号上的区别 二 具体区别与联系 1 继承 泛化 xff08 Generalization xff

随机推荐