Hadoop 多表关联

这篇具有很好参考价值的文章主要介绍了Hadoop 多表关联。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实例描述

  多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息。下面进入这个实例。

  输入是两个文件,一个代表工厂表,包含工厂名列和地址编号列;另一个代表地址列,包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系,输出工厂名-地址名表。

  样例输入:

  factory:

  factoryname addressed
  Beijing Red Star 1
  Shenzhen Thunder 3
  Guangzhou Honda 2
  Beijing Rising 1
  Guangzhou Development Bank 2
  Tencent 3
  Bank of Beijing 1

  address:

  addressID addressname
  1 Beijing
  2 Guangzhou
  3 Shenzhen
  4 Xian

  样例输出:

Hadoop 多表关联

二、设计思路

  多表关联和单表关联类似,都类似于数据库中的自然连接。相比单表关联,多表关联的左右表和连接列更清楚,因此可以采用和单表关联相同的处理方式。Map识别出输入的行属于哪个表之后,对其进行分割,将连接的值保存在key中,另一列和左右表标志保存在value中,然后输出。Reduce拿到连接结果后,解析value内容,根据标志将左右表内容分开存放,然后求笛卡尔积,最后直接输出。

  这个实例的具体分析参考Hadoop 单表关联博客,下面贴出代码。

三、程序代码

  程序代码如下:

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.conf.Configuration;
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 MTjoin {

    public static int time = 0;

    public static class Map extends Mapper<Object, Text, Text, Text>{
        // 在Map中先区分输入行属于左表还是右表,然后对两列值进行分割,
        // 连接列保存在key值,剩余列和左右表标志保存在value中,最后输出
        @Override
        protected void map(Object key, Text value,Mapper<Object, Text, Text, Text>.Context context)
                throws IOException, InterruptedException {
            // super.map(key, value, context);
            String line = value.toString();
            int i=0;
            // 输入文件首行,不处理
            if(line.contains("factoryname")==true || line.contains("addressID")==true){
                return ;
            }
            // 找出数据中的分割点
            while(line.charAt(i)>='9' || line.charAt(i)<='0'){
                i++;
            }
            if (line.charAt(0)>='9'||line.charAt(0)<='0') {
                // 左表
                int j = i-1;
                while(line.charAt(j)!=' ') j--;
                String [] values = {line.substring(0,j),line.substring(i)};
                context.write(new Text(values[1]), new Text("1+"+values[0]));
            }else {
                // 右表
                int j = i+1;
                while(line.charAt(j)!=' ') j++;
                String[] values = {line.substring(0,i+1),line.substring(j)};
                context.write(new Text(values[0]), new Text("2"+values[1]));
            }
        }
    }

    public static class Reduce extends Reducer<Text, Text, Text, Text>{
        // Reduce解析Map输出,将value中数据按照左右表分别保存,然后求 // 笛卡尔积,输出
        @Override
        protected void reduce(Text key, Iterable<Text> values,Reducer<Text, Text, Text, Text>.Context context)
                throws IOException, InterruptedException {
            // super.reduce(arg0, arg1, arg2);
            if (time==0) {
                //  输出文件第一行
                context.write(new Text("factoryname"), new Text("addressname"));
                time++;
            }
            int factorynum = 0;
            String[] factory = new String[10];
            int addressnum = 0;
            String[] address = new String[10];
            Iterator ite = values.iterator();
            while (ite.hasNext()) {
                String record = ite.next().toString();
                int len = record.length();
                int i = 2;
                char type = record.charAt(0);
                String factoryname = new String();
                String addressname = new String();
                if (type=='1') {
                    // 左表
                    factory[factorynum] = record.substring(2);
                    factorynum++;
                }else {
                    // 右表
                    address[addressnum] = record.substring(2);
                    addressnum++;
                }
            }
            if (factorynum != 0 && addressnum !=0) {
                // 求笛卡尔积
                for(int m=0;m<factorynum;m++){
                    for(int n=0;n<addressnum;n++){
                        context.write(new Text(factory[m]), new Text(address[n]));
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
        if(otherArgs.length!=2){
            System.out.println("Usage:wordcount <in> <out>");
            System.exit(2);
        }
        Job job = new Job(conf,"multiple table join");
        job.setJarByClass(MTjoin.class);
        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileInputFormat.addInputPath(job,new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true)?0:1);
    }

}

 文章来源地址https://www.toymoban.com/news/detail-404883.html

到了这里,关于Hadoop 多表关联的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis-plus分页查询(springboot中实现单表和多表查询)

    一、mybatis-plus单表查询 使用mybatis-plus实现单表分页查询 非常方便,主要操作步骤如下: 配置分页查询拦截器 进行分页查询 1.首先,打开mybatis-plus官网的插件(插件主体) 或者点击mybatis-plus插件 我是配置在springboot项目中,所以找到springboot的分页配置 2.配置分页查询拦截器

    2024年02月08日
    浏览(42)
  • 【MySQL视图】视图处理算法 , 创建 {单表,多表,视图中创建视图},查看,和修改。最详细来这里!

    视图 是存储,在调用的时候产生一个结果集的查询。一个视图作为一个虚拟表。 简单理解: 视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。     视图优点 1. 操作

    2024年02月07日
    浏览(41)
  • 【从删库到跑路】MySQL数据库的查询(单表查询,多表查询,内外连接,联合查询,子查询)

    🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 在项目开发中,在进行数据库表结构设计时,会根据业务需求以及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联

    2024年02月10日
    浏览(46)
  • FLink多表关联实时同步

    Oracle-Debezium-Kafka-Flink-PostgreSQL Flink消费Kafka中客户、产品、订单(ID)三张表的数据合并为一张订单(NAME)表。 Oracle内创建三张表 PostgreSQL内创建一张表 其他前置环境 Oracle、PostgreSQL、Kafka、FLink、Debezium-Server的部署参见本系列其他文章搭建。 采用前置条件中的语句建表即可,

    2023年04月25日
    浏览(63)
  • MySQL的多表关联查询

    多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来。 交叉查询就是将多张表的数据没有条件地连接在一起进行展示。 1.1.1 语法 使用交叉查询类别和商品 通过查询结果可以看到,交叉查询其实是一种错误的做法,在查询到的结果集中有大量的错误数据,称交叉

    2024年02月14日
    浏览(37)
  • 多表关联进行update更新数据

    在平常的工作中,我们经常会更新表的数据。常见的表关联更新数据例如用where条件进行表关联,或者用join进行表的连接更新表的数据。 1:创建测试表: 2:将名字为“阿杜”同学的兴趣爱好改为跳舞: 3:如果表数据量比较大,可以查询需要关联的字段,这样可以提高效率

    2024年02月08日
    浏览(37)
  • Hibernate多表关联——(一对多关系)

    hibernate是连接数据库使得更容易操作数据库数据的一个框架,在上一篇文章( 感兴趣的小伙伴点击这里📔’)中我们演示了单表建立查询。接触过数据库的都知道 关系型数据库 表有三种关系, 一对一,一对多,多对多 。而接下来我们在hibernate中建立 一对多 关系,打开数

    2023年04月09日
    浏览(44)
  • MySQL多表关联查询练习题

    1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT , stu_id INT(10) NOT NULL , c_name VARCHAR(20) , grad

    2024年01月17日
    浏览(43)
  • SQL查询数据之多表(关联)查询

      数据表: 关联查询主要分为:(inner join)交叉关联、(left join)左关联、(right join)右关联 (inner join)交叉关联: 定义:(inner join)交叉关联只返回两个表联结相等的字段的行 语法:select * from 表1 inner join 表2 on 表1.字段号=表2.字段号 比如我要查学生表和成绩表的交叉

    2023年04月08日
    浏览(37)
  • 基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理

    在一些复杂的业务表中间查询数据,有时候操作会比较复杂一些,不过基于SqlSugar的相关操作,处理的代码会比较简单一些,以前我在随笔《基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中间表的查询处理》介绍过基于主表和中间表的联合查询,而往往实际会比这个会复杂

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包