索引排序文件--不排序数据排序索引暨介绍大数据常用的显示数据的两种方式

来源:互联网 发布:淘宝比价格的软件 编辑:程序博客网 时间:2024/05/22 08:01

本文讲述近期大数据处理的心得:以索引排序文件--不排序数据排序索引 为例剖析大数据常用的显示数据的两种方式

应用一:根据键盘输入的行数,打印文件对应的行数数据以及后几行数据

已知:

CSDNdataSortindexlast不排序数据的排序索引文件--索引排序文件

CSDN数据原文件

CSDNdataSort为格式化并排序文件

目标详述--根据输入的行数,获得查询类似已经排序好(CSDNdataSort)文件对应 的前几行,但是数据只是对原文件CSDN的索引进行了排序CSDNdataSortindexlast

即处理原文件只有只读属性欲获得得到文件排序操作后对应的效果

1、加载内存的方法(此处数据类型为int类型的索引)

    public static void getfile(    int []index,String path) throws IOException     {         System.out.println("init  start");         int line=0;         BufferedReader br=new BufferedReader(new  InputStreamReader(new FileInputStream(path),"GBK"));//设定缓冲区             String str=null;          while((str=br.readLine())!=null)          {          index[line]= Integer.parseInt(str);//读取字符串转化为整数               line++;          }         br.close();         System.out.println("init  end");    }

2、数据显示到控制台的方法--显示对应数据以及其后的20行

    //RandomAccessFile读的是不排序数据--打印到控制台    public static void show(int [] index,int line,String path) throws FileNotFoundException, IOException     {            System.out.println("show start");                       RandomAccessFile  raf=new   RandomAccessFile(path,"r");//只读的打开随机访问文件                      for(int i=0;i<20;i++)            {               raf.seek(index[line+i]);//移动文件指针--每次移动到line+i 及位置+i以内的数据               String str1=new String(raf.readLine().getBytes("ISO-8859-1"),"GBK");               System.out.println(str1);            }            raf.close();                     System.out.println("show end");     } 

3、测试

        final  int N=6428632;        int []  index =new int[N+1];//索引=id+1           //CSDNdataSortindexlast不排序数据的排序索引文件--索引排序文件        String pathIn="C:\\大数据data\\CSDN\\CSDNdataSortindexlast.txt";       getfile(  index,pathIn) ;//把 不排序数据的排序索引文件(CSDNdataSortindexlast) 载入内存  注意index为int,读到的值为String              String path="C:\\大数据data\\CSDN\\CSDN.txt";        while(true)//根据输入的行数,获得已经排序好(CSDNdataSort)文件对应 的前几行        {            String inputstr=JOptionPane.showInputDialog("输入你要查看的行数");            int line=Integer.parseInt(inputstr);//数据转换            //随机读取文件读取RandomAccessFile 乱序文件--seek定位到(line),若输出其以后多条,用for循环内line+i            show( index,line,path);//显示索引的位置上数据        }

应用二、根据输入的文本输出对应包含该该文本的具体信息

目标详述--根据输入的文本,把不排序数据的排序索引加载内存,RandomAccessFile读CSDN,进行二分法查找

方法:把不排数据排索引 CSDNdataSortindexlast 载入内存,随机存储文件 读 原文件CSDN并根据user字段进行二分查找。注:raf.seek(index[mid]);
rdstr=raf.readLine();  raf.close(); rdstr根据#切割,并取数组第0个为文件user

1、二分法查找

    public static void binsearch(int N,int []index,String path) throws IOException{        String str=JOptionPane.showInputDialog("输入要查询的账户");        str=str.trim();//删除                int max=N;        int min=0;        int times=0;        boolean  isfind=false;        System.out.println( "开始检索");                 while(min<=max)         {             times++;             int mid=(max+min)/2;             RandomAccessFile raf=new    RandomAccessFile( path,"r");//读取             raf.seek(index[mid]);//随机读文件RandomAccessFile 的seek小标是不排序数据的排序索引index[mid]参数是二分查找的mid的值                          String rdstr=raf.readLine();             raf.close();             String [] fl=rdstr.split(" # ");             String lastuser=fl[0].trim();//取出user             if(str.compareTo(lastuser)<0)             {                 max=mid-1;             }             else  if(str.compareTo(lastuser)>0)             {                 min=mid+1;             }             else if(str.compareTo(lastuser)==0)             {                 System.out.println(rdstr);//打印                 isfind=true;                 break;             }         }                 if(!isfind)        {            System.out.println("没有找到");//打印        }        else        {             System.out.println("找到");//打印        }        System.out.println( times+"次");    }
2、测试
        final  int N=6428632;        int []  index =new int[N+1];        String pathIn="C:\\大数据data\\CSDN\\CSDNdataSortindexlast.txt";        getfile(  index,pathIn) ;//读不排序数据的 排序索引:CSDNdataSortindexlast                   String path="C:\\大数据data\\CSDN\\CSDN.txt";         while(true)         {         binsearch(N,index,path);         }

附:生成对内存中索引进行快速排序--CSDNdataSortindexlast
思路:把CSDN文件载入内存,并生成索引,对索引与源文件进行快排,将‘不排数据排索引’写入本地CSDNdataSortindexlast

1、由CSDN文件生成不排序文件的排序索引,载入内存

      public static void init(    String []data,int []  index,int [] iddata,String path ) throws IOException     {         System.out.println("init  start");                 int line=0;         int indexline=0;          InputStreamReader isr=new  InputStreamReader(new FileInputStream(path),"GBK");         BufferedReader br=new BufferedReader(isr);//设定缓冲区             String str=null;          index[indexline]=0;//第一行索引为0          while((str=br.readLine())!=null)          {              indexline++;              byte[] bt=str.getBytes("GBK");              byte[] lt="\r\n".getBytes("GBK");              index[indexline]=bt.length+lt.length;//精确//--读的这一行的长度给索引数组                                          data[line]=str;  //--读的这一行的内容给数据data数组              iddata[line]=line;//00  11  12//--读的这一行的行号给下标数组数组              line++;          }         br.close();         System.out.println("init  end");                 //索引累加        for(int j=1;j<index.length;j++)        {            index[j]+= index[j-1];//把读的这一行长度的索引数组加上上一行        }            }

2、对内存中索引进行快速排序

    public  static  void Qsortplus(   int [] index,String []data,int []iddata, int low,int high)    {        if(low <  high)        {            int lt=low;            int gt=high;//左边,右边            int i=low+1;//开始循环位置                        int temp=index[low];//保存第一个数据            int id=iddata[low];//对应的小标值            String datastr=data[id];//下标对应的数据data值            while(i<=gt)//循环夹逼            {                               String istr=data[iddata[i]];                String [] stl1=datastr.split(" # ");                String [] stl2=istr.split(" # ");                                if(stl2[0].trim().compareTo(stl1[0].trim())  <0) //小于[0]=user                {                    swap(index, lt,i);//移动                    swap(iddata, lt,i);//移动                    lt++;                    i++;                                                        }                else  if(stl2[0].trim().compareTo(stl1[0].trim())  >0)//大于                {                    swap(index,i,gt);//移动                    swap(iddata,i,gt);//移动                    gt--;                                    }                else                {                    i++;                }            }            Qsortplus(   index,data,iddata, low,lt-1);             Qsortplus(    index,data, iddata,gt+1,high);//分段        }    }
3、把排序了的索引写入文件--对内存中索引进行快速排序
    public static void tofile(    int []index,String path) throws IOException     {                 System.out.println("file  start");                OutputStreamWriter otr=new OutputStreamWriter (new FileOutputStream(path),"GBK");         BufferedWriter bw=new BufferedWriter(otr);         for(int i=0;i<index.length;i++)         {               bw.write(index[i]+"\r\n");                 }         bw.close();        System.out.println("file  end");    }

4、测试

        final  int N=6428632;        int []  index =new int[N+1];//索引        String []data =new String[N];//数据        int [] iddata =new int[N];//id                //加载到索引到内存-只需length长度+\r\n,;排序时可以根据某一个数排,可以用split      //生成不排序文件的排序索引,载入内存        String path="C:\\大数据data\\CSDN\\CSDN.txt";        init(  data , index,iddata,path);//init传递3个数组                System.out.println("sort  start");        //对内存中索引进行快速排序        Qsortplus(   index,data,iddata, 0,index.length-2);//最后一个参数=N-1,参数增加了2个数组         System.out.println("sort  end");        //把排序了的索引写入文件        String pathIn="C:\\大数据data\\CSDN\\CSDNdataSortindexlast.txt";        tofile(    index,pathIn);//把不排序数据的排序索引--写入文件CSDNdataSortindexlast ,把索引写入文件







0 0
原创粉丝点击