Mysql中数据配置表,查找其他数据库中的数据,并将数据转为Json格式,上传到Hbase中

1.读取数据库表中某两行的配置信息

2.根据配置信息查询配置字段中的疾病信息

3.将从数据库中查询的数据拼接成Json格式

4.将得到的数据插入hbase中,采用单条插入,批量插入和zeng增量插入的方法

第一步编写连接mysql和关闭mysql的方法,在查询 mysql中的信息时,首先要使用到连接mysql的方法。

第二步获得数据库中的配置信息,定义List<String>格式的变量,存储数据库中的配置信息,使用PrepareStament查询数据库中的信息,然后将查询的结果添加到list中即可。 

public List<String> getMysqlInfo(String id){
     ResultSet rs=null;
     List<String> list1=new ArrayList<String>();
     try {
         String sql="select * from MYSQL_TO_HBASE where id= ? ";
         ps=connection.prepareStatement(sql);
         ps.setString(1,id);
         rs =ps.executeQuery();  

第三步根据查询的配置信息查找疾病史信息,并转为Json格式数据,将数据添加到List<List<String>>leix类型的变量中,需要两个List,第一个List存放标识个人信息的身份证号码,第二个List中存放转为Json格式的疾病史信息,在将数据转为Json时需要去除没有疾病史信息的人员身份证号码,同时使用fastjson将实体类对象数据转换为json数据。

public List<List<String>> getDisease(String id){
     ResultSet rse=null;
     List<String> list= new ArrayList<String>();  //存放转为json格式的疾病史信息
     List<String> list1= new ArrayList<String>();   //存放有疾病史信息的身份证号码
     List<List<String>> list3= new ArrayList<List<String>>(); //存放最终得到的 <身份证号, 疾病史信息>
     try {
         statement=connection.createStatement();   //根据配置表信息的值查询 疾病史信息
         String sql1="select "+getMysqlInfo(id).get(8)+" from 数据库名称."+getMysqlInfo(id).get(6)+"";
         rse =statement.executeQuery(sql1);

上面部分代码得到一个人的疾病信息,然而一个人可以有多条疾病信息,将一条疾病信息封装成一个实体类,并添加上身份证号码,作为实体类。

List<DisNT_Entity> list2= new ArrayList<DisNT_Entity>();//存放一条疾病史信息
String sfzhm=rse.getString(1);
String jbmc1=rse.getString(3);
String jbqznl1=rse.getString(4);

将疾病名称和疾病起始年龄加到一个实体对象里面,对疾病开始日期进行处理,使用身份证号码中出生年月日的方式加起始年龄得到开始时间。

Integer.valueOf(sfzhm.substring(6, 10)) + Integer.valueOf(jbqznl1) + "-" + sfzhm.substring(10, 12)+ "-" +sfzhm.substring(12,14)

判断一个人是否有疾病来添加身份证号码使用flag,在每次创建实体类对象时令flag=true。当存在flag=true时,则将从mysql中得到的疾病信息转为json格式数据。

if(flag){
    String listJson=JSON.toJSON(list2).toString();
    list.add(listJson);
    list1.add(sfzhm);
}

最后将两个list的数据一起添加到list3中即可。

第四步编写hbase的连接方法,关闭,单条插入,批量插入方法,查询hbase中数据

//单条插入
public void insterRow(String tableName, String rowkey, String colFamily, String col, String val)
        throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));
    Put put = new Put(Bytes.toBytes(rowkey));
    put.addColumn(Bytes.toBytes(colFamily), Bytes.toBytes(col), Bytes.toBytes(val));
    table.put(put);
    table.close();
}
//批量插入
public void insterRows(List<Put> putList,String tableName) {
    Table table;
    try {
        table = connection.getTable(TableName.valueOf(tableName));
        table.put(putList);
        table.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

第五步调用编写的Mysql中的方法和Hbase中的方法,批量查询Hbase中是否已有该身份证号码的用户信息,然后用字符串进行拼接旧信息和信息,调用批量插入方法将信息插入到Hbase。

List<List<String>> list=mu.getDisease(id);
//查询已有标签
List<String> reList = hu.getDatas(list.get(0), "tags");
//批量插入
for(int k=0;k<list.get(0).size();k++){
    String jsonTmp1 = "";
    String jsonTmp2 = "";
    String jsonTmp3 = "";
    /*拼接Hbase中已有的字段内容和list中的数据
    Hbase中已有相同rowkey,则将字段赋值给jsonTemp1到倒数第二个字符,并添加逗号,将最后一个字符的]转为,以符合json格 * */
    if (null != reList.get(k) && !"".equals(reList.get(k))) {
        jsonTmp1 = reList.get(k).substring(0,reList.get(k).length()-1)+",";
        jsonTmp2 =  list.get(1).get(k).substring(1);
        jsonTmp3 = jsonTmp1 + jsonTmp2;
    }else {
        jsonTmp3 = list.get(1).get(k);
    }
    /*
    将list中第一个list的内容添加到put,即身份证号码
    将所有的疾病信息即jsonTmp3添加到put
    * */
    Put put = new Put(Bytes.toBytes(list.get(0).get(k)));
    put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("tags"), Bytes.toBytes(jsonTmp3));
    putlist.add(put);
}
//调用HbaseUtils中的批量插入方法,将数据插入到Hbase中
hu.insterRows(putlist,tablename);
发布了36 篇原创文章 · 获赞 19 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_27182767/article/details/84504028
今日推荐