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);