基于NoSQL数据库实现论文信息存储以及统计分析
前两天完成了一个小作业,算是大数据方向一点初级知识的练手,就把完整的过程放上博客,有相关作业的同学可以借鉴。
题目:
数据:一万篇论文信息
要求:1.将数据分布式存入NoSQL数据库
2.统计在这一万篇中各个作者的发布论文篇数,统计排序
3.结果数据作图展示
(数据文件放百度盘,链接https://pan.baidu.com/s/1vjK0Pf8h-KsixxG7jzFukg,提取码dvd9)
前提条件:
Hadoop集群搭建、hive、hbase
实现过程:
一、数据预处理
先使用小的样本文件sample.txt,完成一次再试验较大的科学论文数据savedrecs.txt。
拿到数据文件,首先看一下格式,各个字段含义,下图是一篇论文的数据。样本文件中有9篇。
要如何批量导入数据库?数据文件的格式如何解析?
方法有很多,可以直接写个MR程序按照文件里的格式拆分,然后通过连接HBase的api导入Hbase的,效率也比较高。
不过当时我立刻想到的是另一种方法。思路是,先将数据转换为json格式导入hive,再用hive里自带的getJsonObject解析json格式数据,自动按属性生成列名生成表。最后通过hive关联hbase表,写句hql语句就批量导入hbase。其实底层还是MR,不用自己写而已。
然后下面是我写了个java程序把数据转换成json,写的不是很好。改一下自己的文件路径运行生成json文件。或者用notepad++之类的文本编辑器,能直接替换字符,最后是json的格式就行。
import org.codehaus.jettison.json.JSONException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TextToJson {
public static void main(String[] args) throws Exception {
//IO流读数据
FileInputStream fs=new FileInputStream("D:\\NoSQL\\课程设计\\sample.txt");
byte[] b=new byte[1048703];
int d;
String text="";
while ((d=fs.read(b))!=-1){
text+=new String(b,0,d);
}
text=text.trim();//将文本中的前后空格去掉
text=text.replaceAll("\n\n\n\n\n","\n\n");//大文件中每500篇是四个空行,替换为一个空行
text=text.replaceAll("\"","\'");//json格式中按"key":"value"区分每个属性,要将文件中双引号替换掉
String[] columns=text.split("\n\n");//按照空行拆分每篇论文
int rowkey=1;//多加一项rk后续作为hbase的rowkey
for(String column:columns){
textToJson(column,rowkey);
rowkey++;
}
fs.close();
}
private static void textToJson(String text,int rowkey) throws IOException, JSONException {
text = text.trim();
//将论文按每个属性拆分
String formatText = text.replaceAll("\n ", " ");
formatText = formatText.replaceAll(", ", ",");
String[] columns = formatText.split("\n");
//拆分key和value
String[] columnNames = new String[columns.length];
String[] columnValues = new String[columns.length];
String jsonString = "";
for (int i = 0; i < columns.length; i++) {
columnNames[i] = columns[i].substring(0, 2);
columnValues[i] = columns[i].substring(3);
jsonString += "\"" + columnNames[i].toLowerCase() + "\"" + ":" + "\"" + columnValues[i] + "\"";
if (i != columns.length - 1) {
jsonString += ",";
}
}
String rowString = "\"rk\"" + ":" + "\"" + rowkey + "\",";
jsonString = "{" + rowString + jsonString +<