分析:

1、由于是任意列 任意表 任意路径,我们很容易想到是参数传入,参数传入后怎么去获得参数,根据我们以往的经验就是通过args[]来获取,但是在mapper或者是reducer中,我们不能直接将参数传入,因为map 和reduce是通过反射机制来创建的,对于传入的参数我们不能直接使用;我们发现在map和reduce有一个参数context,此类中包含很多的信息,例如configuration,并且configuration 还有set()方法,因此 我们可以将参数传给conf,然后由context拿到conf,进而拿到参数/

2、表头在第一行,有且只有一行,因此可以将表头的信息写入mapper 的setup()方法,因为它只进行一次操作

代码:

定义最后的程序运行为 hadoop jar **.jar t1 /tt "f1:c1|f1:c2|f2:c3"

对"f1:c1|f1:c2|f2:c3"进行拆分,首先按照"|"进行拆分,在java中 split("\\|"),因为|是转义字符,然后对每个f:c 再按照":"拆分,此时我们就拿到了单独的列族和列

定义自己的mapper函数(由于我们只是将数据读取出来,所以不用写reducer)

  1. public static class MyMapper extends TableMapper<Text, Text> {
  2.  
  3. @Override
  4. protected void setup(Context context) throws IOException,
  5. InterruptedException {
  6. String familyscolumns = context.getConfiguration().get(
  7. "familys:columns");
  8. String[] familycolumns = familyscolumns.split("\\|");
  9. String familycolumn = "";
  10. for (String fc : familycolumns) {
  11. familycolumn += fc + "\t";
  12. }
  13. // 在第一行增加header 行健 列族:列
  14. context.write(new Text("rowkey"), new Text(familycolumn));
  15. }
  16.  
  17. Text k2 = new Text();
  18. Text v2 = new Text();
  19.  
  20. @Override
  21. protected void map(ImmutableBytesWritable key, Result value,
  22. Context context) throws IOException, InterruptedException {
  23. k2.set(key.get());
  24. String familyscolumns = context.getConfiguration().get(
  25. "familys:columns");
  26. String[] familycolumns = familyscolumns.split("\\|");
  27. String familycolumn="";
  28. Cell columnLatestCell1=null;
  29. for (String string : familycolumns) {
  30. String[] fc = string.split(":");
  31. columnLatestCell1 = value.getColumnLatestCell(
  32. fc[0].getBytes(), fc[1].getBytes());
  33. if (columnLatestCell1 != null) {
  34. familycolumn+=new String(columnLatestCell1.getValue())+"\t";
  35. } else{
  36. familycolumn+="\t";
  37. }
  38.  
  39. }
  40. v2.set(new String(familycolumn));
  41. context.write(k2, v2);
  42. }
  43.  
  44. }

  然后在客户端提交job

并把参数写入conf

  1. Configuration conf = HBaseConfiguration.create();
  2. conf.set("table", args[0]);
  3. conf.set("hdfsPath", args[1]);
  4. conf.set("familys:columns", args[2]);

  

用mr实现将hadoop中的数据导入到hbase(我之前一直纠结是写在map还是reduce,其实无所谓啦)

  1. public static void main(String[] args) throws Exception {
  2. PropertyConfigurator.configure(ClassLoader
  3. .getSystemResource("log4j.properties"));
  4. final Configuration configuration = new Configuration();
  5. // 设置zookeeper
  6. configuration.set("hbase.zookeeper.quorum", "hadoop");
  7. // 设置hbase表名称
  8. configuration.set(TableOutputFormat.OUTPUT_TABLE, "t2");
  9. // 将该值改大,防止hbase超时退出
  10. configuration.set("dfs.socket.timeout", "180000");
  11.  
  12. final Job job = Job.getInstance(configuration,
  13. MR2HB.class.getSimpleName());
  14. TableMapReduceUtil.addDependencyJars(job);
  15. job.setJarByClass(MR2HB.class);
  16.  
  17. job.setMapperClass(MyMapper.class);
  18. job.setNumReduceTasks(0);
  19. // 设置map的输出,不设置reduce的输出类型
  20. job.setMapOutputKeyClass(LongWritable.class);
  21. job.setMapOutputValueClass(Text.class);
  22.  
  23. job.setInputFormatClass(TextInputFormat.class);
  24. // 不再设置输出路径,而是设置输出格式类型
  25. job.setOutputFormatClass(TableOutputFormat.class);
  26.  
  27. FileInputFormat.setInputPaths(job, "hdfs://hadoop:9000/part-m-00000");
  28.  
  29. job.waitForCompletion(true);
  30.  
  31. }
  32.  
  33. public static class MyMapper extends
  34. Mapper<LongWritable, Text, NullWritable, Put> {
  35. @Override
  36. protected void map(LongWritable key, Text value,
  37. org.apache.hadoop.mapreduce.Mapper.Context context)
  38. throws IOException, InterruptedException {
  39. String[] split = value.toString().split("\t");
  40. Log.info(split[0]);
  41.  
  42. Put put = new Put(Bytes.toBytes(split[0]));
  43. put.add(Bytes.toBytes("f1"), Bytes.toBytes("age"),
  44. Bytes.toBytes(split[1]));
  45. if (split.length == 4) {
  46. put.add(Bytes.toBytes("f2"), Bytes.toBytes("address"),
  47. Bytes.toBytes(split[2]));
  48. put.add(Bytes.toBytes("f1"), Bytes.toBytes("name"),
  49. Bytes.toBytes(split[3]));
  50. }
  51. context.write(NullWritable.get(), put);
  52. }
  53.  
  54. }

  

用mapreduce实现从hbase导出到hdfs,实现一个工具类,能够支持任意表 任意列 任意路径导出,并且支持表头的更多相关文章

  1. Java导出防止小数显示不全工具类

    1.说明 在做项目的过程中,发现导出功能中的数据显示不全,如"0.4",会显示成".4":"-0.8"会显示成"-.8" ...

  2. poi报表导出4.1.0版本工具类 导出并下载

    这一段时间,由于项目上线基于稳定,所以我这边在基于我们一期迭代的分支上优化一部分我们之前没有做的功能,报表导出.本身之前用的是3.5的版本,但是由于同事要写导入,写的代码只有4.1.0的版本支持,所以 ...

  3. 把kafka数据从hbase迁移到hdfs,并按天加载到hive表(hbase与hadoop为不同集群)

    需求:由于我们用的阿里云Hbase,按存储收费,现在需要把kafka的数据直接同步到自己搭建的hadoop集群上,(kafka和hadoop集群在同一个局域网),然后对接到hive表中去,表按每天做分 ...

  4. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  5. 导入导出封装的工具类 (一) 利用POI封装

    对于导入导出各个项目中差点儿都会用到,记得在高校平台中封装过导入导出这部分今天看了看是利用JXL封装的而经理说让我用POI写写导出,这两个导入导出框架是眼下比較流程和经常使用的框架,有必要都了解一下. ...

  6. 导入导出Excel的Java工具类ExcelUtil

    在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单 ...

  7. Workbook导出excel封装的工具类

    在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...

  8. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  9. HBase数据导出到HDFS

    一.目的 把hbase中某张表的数据导出到hdfs上一份. 实现方式这里介绍两种:一种是自己写mr程序来完成,一种是使用hbase提供的类来完成. 二.自定义mr程序将hbase数据导出到hdfs上 ...

随机推荐

  1. 详解spring boot实现多数据源代码实战

    之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.propertie ...

  2. 17 nginx连接memcached

    一:配置php扩展memcached wget http://memcached.googlecode.com/files/memcached-1.4.9.tar.gz # tar zvxf memc ...

  3. Java带标签的break 和带标签的continue

    最开始没有学习java 学习的是C语言然后工作开始用java,但当时并没有仔细看过java的书籍,也是大致一翻就看跟C语言很像,了解了基本语法就没有深究了,今天看书开始发现之前没有了解过的语法 带标签 ...

  4. node.js的http模块的基础 学到的东西

    node.js的http模块的基础 学到的东西 其中客户端:我们在node.js中如果要请求服务端中的js或者其他脚本的话要使用http.request()方法他会返回http.ClientReque ...

  5. POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]

    Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8301   Accepted: 3 ...

  6. SQL时间戳的使用(转)

    一直对时间戳这个概念比较模糊,相信有很多朋友也都会误认为:时间戳是一个时间字段,每次增加数据时,填入当前的时间值.其实这误导了很多朋友. 1.基本概念 时间戳:数据库中自动生成的唯一二进制数字,与时间 ...

  7. 解决Ubuntu(乌班图)vi/vim模式下粘贴的代码内容会多出的空格的问题

    vi/vim模式下的粘贴 因为linux系统和win系统的差异性,有时候在win环境运行的python代码会放在Linux系统上执行,这个时候就需要把win系统上IDE上的代码copy下来,在Linu ...

  8. Spring IOC 容器源码分析(转)

    原文地址 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢 ...

  9. 常见C C++问题(转)

    这一部分是C/C++程序员在面试的时候会被问到的一些题目的汇总.来源于基本笔试面试书籍,可能有一部分题比较老,但是这也算是基础中的基础,就归纳归纳放上来了.大牛们看到一笑而过就好,普通人看看要是能补上 ...

  10. PAT 天梯赛 L2-028. 秀恩爱分得快 【数据处理】

    题目链接 https://www.patest.cn/contests/gplt/L2-028 思路 0.只处理被询问的情侣的亲密度,否则会超时 1.要注意输入数字要用字符串,还要标记性别 因为 输出 ...