大数据表转移hdfs后查询处理

原创 2017年07月17日 19:52:00

reduce端join算法实现
1、需求:
订单数据表t_order:
id date pid amount
1001 20150710 P0001 2
1002 20150710 P0001 3
1002 20150710 P0002 3

商品信息表t_product
id name category_id price
P0001 小米5 C01 2
P0002 锤子T1 C01 3

假如数据量巨大,两表的数据是以文件的形式存储在HDFS中,需要用mapreduce程序来实现一下SQL查询运算:
select a.id,a.date,b.name,b.category_id,b.price from t_order a join t_product b on a.pid = b.id

2、实现机制:
通过将关联的条件作为map输出的key,将两表满足join条件的数据并携带数据所来源的文件信息,发往同一个reduce task,在reduce中进行数据的串联

public class OrderJoin {

static class OrderJoinMapper extends Mapper<LongWritable, Text, Text, OrderJoinBean> {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        // 拿到一行数据,并且要分辨出这行数据所属的文件
        String line = value.toString();

        String[] fields = line.split("\t");

        // 拿到itemid
        String itemid = fields[0];

        // 获取到这一行所在的文件名(通过inpusplit)
        String name = "你拿到的文件名";

        // 根据文件名,切分出各字段(如果是a,切分出两个字段,如果是b,切分出3个字段)

        OrderJoinBean bean = new OrderJoinBean();
        bean.set(null, null, null, null, null);
        context.write(new Text(itemid), bean);

    }

}

static class OrderJoinReducer extends Reducer<Text, OrderJoinBean, OrderJoinBean, NullWritable> {

    @Override
    protected void reduce(Text key, Iterable<OrderJoinBean> beans, Context context) throws IOException, InterruptedException {

         //拿到的key是某一个itemid,比如1000
        //拿到的beans是来自于两类文件的bean
        //  {1000,amount} {1000,amount} {1000,amount}   ---   {1000,price,name}

        //将来自于b文件的bean里面的字段,跟来自于a的所有bean进行字段拼接并输出
    }
}

}

缺点:这种方式中,join的操作是在reduce阶段完成,reduce端的处理压力太大,map节点的运算负载则很低,资源利用率不高,且在reduce阶段极易产生数据倾斜

解决方案: map端join实现方式

4.4.2 map端join算法实现
1、原理阐述
适用于关联表中有小表的情形;
可以将小表分发到所有的map节点,这样,map节点就可以在本地对自己所读到的大表数据进行join并输出最终结果,可以大大提高join操作的并发度,加快处理速度
2、实现示例
–先在mapper类中预先定义好小表,进行join
–引入实际场景中的解决方案:一次加载数据库或者用distributedcache
public class TestDistributedCache {
static class TestDistributedCacheMapper extends Mapper

使用Hadoop的MapReduce与HDFS处理数据

hadoop是一个分布式的基础架构,利用分布式实现高效的计算与储存,最核心的设计在于HDFS与MapReduce,HDFS提供了大量数据的存储,mapReduce提供了大量数据计算的实现,通过Java...
  • tpkey
  • tpkey
  • 2014年11月19日 16:16
  • 2858

Spark读取HDFS上的SQL语句,然后导入MySQL

现在Hive执行结果会存储到HDFS上,这些文件是一些SQL语句,我们可以通过Spark读取这些文本文件,然后导入到MySQL中,下面是实现了如何通过Spark来读取HDFS,通过在Parition中...
  • shenfuli
  • shenfuli
  • 2016年09月08日 14:09
  • 2488

Druid 一次海量数据实时处理的实践

Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析...
  • crasheye
  • crasheye
  • 2016年08月22日 15:58
  • 5160

GB2312码表(用于Python等直接查询处理)

  • 2016年03月30日 22:16
  • 23KB
  • 下载

ase性能和调优系列:查询处理和抽象计划

  • 2013年03月18日 12:29
  • 4.66MB
  • 下载

Blog(MySql中通用查询处理流程)配套示例代码

  • 2016年04月01日 16:53
  • 968KB
  • 下载

Oracle查询处理in条件超过1000条

  • 2017年11月06日 20:19
  • 5KB
  • 下载

CH4 全局查询处理和优化

  • 2013年11月08日 11:13
  • 613KB
  • 下载

PostgreSQL查询处理部分源码分析

  • 2009年05月06日 16:03
  • 658KB
  • 下载

第6章 查询处理和优化.ppt

  • 2012年11月29日 12:42
  • 449KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大数据表转移hdfs后查询处理
举报原因:
原因补充:

(最多只允许输入30个字)