实现一个工具类,可以把HBase任意表的任意多的列导出到任意指定的HDFS中

package hbase;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class HBase2HdfsUtils {
    /**
     * args[0]  表名
     * args[1]    列族、列名称列表,格式---列族:列
     * args[2]  输出路径
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //获取Hbase的配置信息,从resources目录下的hbase-site.xml文件中获取配置信息
        Configuration conf = HBaseConfiguration.create();
        //设置列族、列名称信息列表参数,格式--列族:列
        conf.set("FamilyColumnsList", args[1]);

        //申明一个客户端
        Job job = Job.getInstance(conf, HBase2HdfsUtils.class.getSimpleName());
        //打成jar包执行需要指定类名
        job.setJarByClass(HBase2HdfsUtils.class);

        //指定HBase中需要导出表的信息,即map的输入
        Scan scan = new Scan();
        TableMapReduceUtil.initTableMapperJob(args[0], scan, MyMapper.class, Text.class,  Text.class, job);

        //设置输入的配置信息:key、value的类型
        job.setMapperClass(MyMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);

        //从hbase导出数据到hdfs不需要reduce,所以设置reduce的任务数为0
        job.setNumReduceTasks(0);

        //设置输出的配置信息:key、value的类型以及输出路径
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        //如果输出目录存在,则删除输出目录
        Path path = new Path(args[2]);
        FileSystem fs = FileSystem.get(new URI(args[2]), new Configuration());
        if(fs.exists(path)){
            fs.delete(path, true);
        }

        FileOutputFormat.setOutputPath(job, new Path(args[2]));

        job.waitForCompletion(true);
    }
    static class MyMapper extends  TableMapper<Text, Text>{
        Text k2 = new Text();
        Text v2 = new Text();
        @Override
        protected void map(
                ImmutableBytesWritable key,
                Result value,
                Mapper<ImmutableBytesWritable, Result, Text, Text>.Context context)
                throws IOException, InterruptedException {
            k2.set("");

            String v2Text = "";
            String familyColumnsList = context.getConfiguration().get("FamilyColumnsList");
            String[] splited = familyColumnsList.split(",");

            String title = "";  //标题
            for (String split : splited) {
                String[] column = split.split(":");
                //根据列族、列获取值
                Cell cell = value.getColumnLatestCell(column[0].getBytes(), column[1].getBytes());
                //判断据列族、列获取到的cell不为空,否则会报空指针错误
                if(cell!=null){
                    title += new String(CellUtil.cloneQualifier(cell)) + ":" +  new String(CellUtil.cloneQualifier(cell)) +  "\t" ;
                    v2Text += new String(CellUtil.cloneValue(cell)) +  "\t" ;
                }

            }

            v2.set(title + "\n" + v2Text);
            context.write(k2, v2);
        }
    }

}
时间: 2024-12-20 10:33:11

实现一个工具类,可以把HBase任意表的任意多的列导出到任意指定的HDFS中的相关文章

SharedPreferences的一个工具类适合的数据类型包括String、Integer、Boolean、Float、Long

package com.jianong.xmtt.util; import android.content.Context; import android.content.SharedPreferences; /** * SharedPreferences的一个工具类,调用setParam就能保存String, Integer, Boolean, Float, Long类型的参数 * 同样调用getParam就能获取到保存在手机里面的数据 * Created by hgl on 2016/6/2

JDBC的增删改写成一个方法,调用一个工具类

package com.hx.jdbc.connection; import java.sql.Connection; import java.sql.Statement; import com.mysql.jdbc.UpdatableResultSet; import junit.framework.TestCase; public class JDBCText extends TestCase { /** * 创建一个insert,update,delete通用的方法 * @param sq

对象序列化和反序列化应该写为一个工具类

对象序列化和反序列化工具类 package com.umu.util; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.Object

封装一个工具类实现JDBC与MySQL数据库的连接

package com.cn.jdbc; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; public class JDBC_Connection { //加载驱动,链接数据库 public stati

获取当天的开始时间、结束时间等等的一个工具类

import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.List; /** * Date工具类 */public class Dateutil { /**     * 当天的开始时间     * @return     */    public static long startOfTodDay() {        Calendar calendar = Calend

一个工具类,生成一些废代码,用于混淆

发布多个微信小游戏,因为用的游戏框架是同一个,被微信判定代码雷同不给过审核. 于是加了点废代码.不知道能不能过哦.如果是人工审核,那基本没戏... 工具类 /** * 生成一些废代码,用于混淆 * @author chenkai 2018/10/7 */ class ConfuseTool { public constructor() { } public static createClass(num:number){ let str = ""; for(let i=0;i<nu

封装一个工具类,搞定图片批量下载

项目中用到的,要求一次下载30张图片.开始时使用谷歌bitmap fun中提供的ImageFetcher来下载,但是发现一个蛋疼无比现象,图片总是莫名其妙的少几张. 排除了图片地址存在无效链接外,怀疑是并发下载线程个数太多,线程池满了以后,使用抛弃策略将以前的下载线程抛弃了. 求人不如求己,自己写一个吧. 在这里使用线程池,支持并发下载.线程池可以自己选择,使用newSingleThreadExecutor,newFixedThreadPool,newCachedThreadPool中的任意一种

Swift:简单封装一个工具类模板

创建模板类(封装一个类)新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var description: String var price: Double var stock: Int init(name: String, description: String, price: Double, stock: Int) { self.name = name self.description =

爬取当当网的图书信息之封装一个工具类

把这个类名取为Tool 封装一个下载网页的方法GetHtml public static string GetHtml(string url) { try { WebClient wb = new WebClient(); return wb.DownloadString(url); } catch { return ""; } } 传入的是这个网页的URL,这个方法能帮我们把网页下载下来封装一个匹配图书类URL的的方法 public static ArrayList GetList(