Hadoop之使用MR编程实现join的两种方法


前言:通过MR不同方式的Join编程是为了更加熟悉join的实现过程以及不同方式的优缺点,切记,生产中要杜绝写MR,本文只供学习参考

1.需求

有两张表,分表是产品信息数据以及用户页面点击日志数据如下:

#产品信息数据:product_info.txt
#c1=产品ID(id),c2=产品名称(name),c3=价格(privce),c4=生产国家(country)
p0001,华为,8000,中国
p0002,小米,3000,中国
p0003,苹果,1500,美国
p0004,三星,10000,韩国

#用户页面点击日志数据:page_click_log.txt
#c1=用户ID(id),c2=产品id(prod_id),c3=点击时间(click_time),c4=动作发生地区(area)
u0001,p0001,20190301040123,华中
u0002,p0002,20190302040124,华北
u0003,p0003,20190303040124,华南
u0004,p0004,20190304040124,华南

由于点击日志的数据量过去庞大,数据是存在HDFS上,故需要使用MR来实现如下的逻辑:

select b.id,b.name,b.privce,b.country,a.id,a.click_time,a.area 
from page_click_log a join product_info b on a.prod_id=b.id

2.Map端实现Join

2.1思路分析

可以将小表数据分发到所有的map节点,然后可以与在本所读到的大表数据进行join并输出最终结果
优缺点:大大提高了jion的并发,速度快

2.2编程实现

数据封装类Info.java

package com.wsk.bigdata.pojo;

import org.apache.hadoop.io.Writable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;

public class Info implements Writable {
   

	/**
	 * 产品唯一标识id
	 */
	private String pId;

	/**
	 * 产品名称
	 */
	private String pName;

	/**
	 * 产品价格
	 */
	private float price;

	/**
	 * 产品生产地区
	 */
	private String produceArea;

	/**
	 * 用户Id
	 */
	private String uId;

	/**
	 * 用户点击时间戳:yyyyMMddHHmmss
	 */
	private String dateStr;

	/**
	 * 用户点击发生地区
	 */
	private String clickArea;


	/**
	 * flag=0,表示封装用户点击日志数据
	 * flag=1,表示封装产品信息
	 */
	private String flag;

	public String getpId() {
   
		return pId;
	}

	public void setpId(String pId) {
   
		this.pId = pId;
	}

	public String getpName() {
   
		return pName;
	}

	public void setpName(String pName) {
   
		this.pName = pName;
	}

	public float getPrice() {
   
		return price;
	}

	public void setPrice(float price) {
   
		this.price = price;
	}

	public String getProduceArea() {
   
		return produceArea;
	}

	public void setProduceArea(String produceArea) {
   
		this.produceArea = produceArea;
	}

	public String getuId() {
   
		return uId;
	}

	public void setuId(String uId) {
   
		this.uId = uId;
	}

	public String getDateStr() {
   
		return dateStr;
	}

	public void setDateStr(String dateStr) {
   
		this.dateStr = dateStr;
	}

	public String getClickArea() {
   
		return clickArea;
	}

	public void setClickArea(String clickArea) {
   
		this.clickArea = clickArea;
	}

	public String getFlag() {
   
		return flag;
	}

	public void setFlag(String flag) {
   
		this.flag = flag;
	}

	public Info(String pId, String pName, float price, String produceArea, String uId, String dateStr, String clickArea, String flag) {
   
		this.pId = pId;
		this.pName = pName;
		this.price = price;
		this.produceArea = produceArea;
		this.uId = uId;
		this.dateStr = dateStr;
		this.clickArea = clickArea;
		this.flag = flag;
	}

	public Info() {
   
	}

	@Override
	public String toString() {
   
		String[] fileds = {
   this.pId,};
		return "pid=" + this.pId + ",pName=" 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值