基于NoSQL数据库实现论文信息存储以及统计分析

本文介绍了如何利用NoSQL数据库HBase存储一万篇论文信息,并通过MapReduce进行统计分析,包括作者论文篇数的排序。数据预处理、Hive解析JSON数据、HBase数据导入及MapReduce程序编写被详细阐述。最后,通过Matlab进行了分析结果的可视化展示。
摘要由CSDN通过智能技术生成

基于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 +<
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值