`

java:大数据文件写入,读取,分割,排序,合并

 
阅读更多
package arrays.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;

public class ConcludeCombinationSortWrite {
/**
  * 大数据排序合并
  *
  * @param args
  */
public static void main(String[] args) throws IOException {
  // 写入文件的路径
  String filePath = "D:\\456";
  // 切分文件的路径
  String sqlitFilePath = "D:\\456\\123";

  //数据的个数
  int CountNumbers=10000000;
 
  //子文件的个数
  int CountFile=10;
 
  //精度
  int countAccuracy=30*CountFile;
 
  long startNumber=System.currentTimeMillis();
  // 写入大数据文件
  WriteData(filePath,CountNumbers);
  System.out.println("存储完毕");
 
  // 将大数据文件切分到另外的十个小文件中
  sqlitFileDate(filePath, sqlitFilePath,CountFile);
  System.out.println("文件切割完毕!");

  // 把每个文件的数据进行排序
  singleFileDataSort(sqlitFilePath,CountFile);
  System.out.println("每个子文件排序完毕!");
 
  //精度调整,十个文件数据进行比较整合
  deathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile);
  System.out.println("整合完毕");
  long stopNumber=System.currentTimeMillis();
  System.out.println("耗时"+(stopNumber-startNumber)/1000+"毫秒");
}

// 写入大数据文件
public static void WriteData(String path,int CountNumbers) throws IOException {
  path = path + "\\12114.txt";
  FileWriter fs = new FileWriter(path);
  BufferedWriter fw=new BufferedWriter(fs);
  for (int i = 0; i < CountNumbers; i++) {
   fw.write(new Random().nextInt(Integer.MAX_VALUE) + "\r\n");
  }
  fw.close();
  fs.close();
 
}

// 将大数据文件切分到另外的十个小文件中
public static void sqlitFileDate(String filepath, String sqlitPath,
   int CountFile) throws IOException {
  FileWriter fs = null;
  BufferedWriter fw=null;
  FileReader fr = new FileReader(filepath + "\\12114.txt");
  BufferedReader br = new BufferedReader(fr); // 读取获取整行数据
 
  int i = 1;
  LinkedList WriterLists=new LinkedList();    //初始化文件流对象集合
  LinkedList fwLists=new LinkedList();
  for (int j = 1; j <= CountFile; j++) {
  
    //声明对象
    fs = new FileWriter(sqlitPath + "\\12" + j + ".txt",false);
    fw=new BufferedWriter(fs);
   
   
    //将对象装入集合
    WriterLists.add(fs);
    fwLists.add(fw);
  }
  //判断是文件流中是否还有数据返回
  while (br.ready()) {
  
   int count=1;//初始化第一文件流
   for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
    BufferedWriter type = (BufferedWriter) iterator.next();
    if(i==count)//判断轮到第几个文件流写入数据了
    {
     //写入数据,跳出,进行下一个文件流,下一个数据的写入
     type.write(br.readLine() + "\r\n");
     break;
    }
    count++;
   }
   //判断是否到了最后一个文件流了
   if (i >= CountFile) {
    i = 1;
   } else
    i++;
  }
  br.close();
  fr.close();
  for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
   BufferedWriter object = (BufferedWriter) iterator.next();
   object.close();
  }
  //遍历关闭所有子文件流
  for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
   FileWriter object = (FileWriter) iterator.next();
   object.close();
  }
}

// 把每个文件的数据进行排序
public static void singleFileDataSort(String path1,int CountFile) throws IOException {
  LinkedList nums = null;
  for (int i = 1; i <= CountFile; i++) {
   nums = new LinkedList();
   String path = path1 + "\\12" + i + ".txt";
   try {
    FileReader fr = new FileReader(path);
    BufferedReader br = new BufferedReader(fr);
    while (br.ready()) {
     // 将读取的单个数据加入到集合里面
     nums.add(Integer.parseInt(br.readLine()));
    }
    // 对集合进行排序
    Collections.sort(nums);

    // 将排序好的数据写入源文件
    numberSort(nums, path);
    br.close();
    fr.close();
   } catch (NumberFormatException e) {
    e.printStackTrace();
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
}

// 对每个文件数据进行排序,再写入源文件
public static void numberSort(LinkedList list, String path) {
  try {
   FileWriter fs = new FileWriter(path);
   BufferedWriter fw=new BufferedWriter(fs);
   for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    Object object = (Object) iterator.next();
    fw.write(object + "\r\n");
   }
   fw.close();
   fs.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
}

// 文件数据最终整合(精度调整)
public static void deathDataFile(String filepath, String sqlitFilePath1,
   int countAccuracy, int CountFile) throws IOException {
  LinkedList nums = new LinkedList();                                       //添加数据,进行排序
  Object temp = null;                                                       // 记录每次排序剩下的最后一个数字
  boolean ispass = false;
  LinkedList ispasses = null;                                               //记录数据文件的状态信息
  FileWriter fs = new FileWriter(filepath + "\\Sort.txt", false);           //创建文件流,以便整合的数据写入
  BufferedWriter bw=new BufferedWriter(fs);
  FileReader fr = null;                                                     //声明读取文件流
  BufferedReader br = null;                                                 //声明BufferedReader
  LinkedList WriterLists = new LinkedList(); // 初始化文件流对象集合
  LinkedList WriterListFile = new LinkedList();
  for (int j = 1; j <= CountFile; j++) {

   // 声明对象,开启所有子文件流访问所有子文件的数据
   fr = new FileReader(sqlitFilePath1 + "\\12" + j + ".txt");
  
   //开启所有BufferedReader,方便下次的整行的读取
   br = new BufferedReader(fr);
  
   // 将所有 FileReader对象装入集合
   WriterListFile.add(fr);
  
   // 将所有 BufferedReader对象装入集合
   WriterLists.add(br);
  }

  for (;;) {

   // 将十个源文件的是否有数据情况存入集合,以方便后面做判断
   ispasses = new LinkedList();
  
   // 分别读取十个源文件的单个数据
   for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
    BufferedReader object = (BufferedReader) iterator.next();
    Object obj = null;
    while (object.ready()) {
     //添加所有文件流的每次的数据
     nums.add(Integer.parseInt(object.readLine().toString()));
     break;
    }
    if (object.ready() == false)
     ispasses.add("true");           //将各文件中的数据状态存入集合中
   }
  
   // 决断是否是第一次进来
   if (nums.size() % countAccuracy == 0 && ispass == false) {

    // 对集合进行排序
    Collections.sort(nums);

    // 接收最大的数据,其它的数据写入总排序文件
    temp = numberSortData(nums, filepath, false, countAccuracy, bw);
   
    //重新初始化集合
    nums = new LinkedList();

    // 添加上一组比较剩下的数据
    nums.add(temp);
    ispass = true;

    // 记录源文件的数据数量,以便下次的遍历
    continue;
   }
   if (ispass) {
    if (nums.size() % countAccuracy == 1 && nums.size() > 1) {
     // 对集合进行排序
     Collections.sort(nums);

     // 接收最大的数据,其它的数据写入总排序文件
     temp = numberSortData(nums, filepath, true, countAccuracy,
       bw);
     nums = new LinkedList();
     nums.add(temp);
     continue;
    }

   }
   // 记录下一组数据的位置

   // 判断是不是十个文件都没有数据
   if (ispasses.size() == CountFile) {
    Collections.sort(nums);
    temp = numberSortData(nums, filepath, true, countAccuracy, bw);
    nums = new LinkedList();
    break;
   }
  }

  bw.close();
  //关闭写入流
  fs.close();
 
  //关闭所有的BufferedReader
  for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
   BufferedReader object2 = (BufferedReader) iterator.next();
   object2.close();
  }
 
  //关闭所有的FileReader
  for (Iterator iterator = WriterListFile.iterator(); iterator.hasNext();) {
   FileReader object = (FileReader) iterator.next();
   object.close();
  }
}

// 对数据进行排序,写入最终文件中(精度调整)
public static Object numberSortData(LinkedList list, String filePath,
   boolean ispass, int countAccuracy,BufferedWriter fs) {
  Object temp = 0;                                                        //记录最后一个值
  int tempCount = 0;                                                      //记录写入的数据位置
  try {
   for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    Object object = (Object) iterator.next();

    // 判断是否是最后一个数
    if (tempCount == list.size() - 1) {
     // 判断集合里面不足一百個數了
     if (list.size() < countAccuracy + 1 && ispass) {
      temp = null;
     } else {
      temp = object;
      break;
     }
    }

    // 写入数据源
    fs.write(object + "\r\n");

    // 记录数据的下标
    tempCount++;
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  return temp;
}
}
0
2
分享到:
评论

相关推荐

    java实现大文件分割与合并的实例代码

    这个实例主要用于处理大量数据,例如进行大数据排序,它包括四个主要步骤:写入大文件、文件分割、单文件排序和数据整合。 1. **写入大文件**: 在`WriteData`方法中,我们创建了一个名为`12114.txt`的大文件,并...

    Hadoop示例程序合并文件

    总之,“Hadoop示例程序合并文件”揭示了Hadoop如何利用分布式计算和存储能力来解决大数据的挑战。理解这一过程对于开发者和数据工程师来说至关重要,因为它展示了如何在Hadoop环境中有效地管理和处理大规模数据。

    java归并外排序

    3. 合并:最后,使用归并算法将所有排序好的块合并成一个有序的大文件。归并过程中,我们逐个读取各块的顶部元素,比较它们的大小,选择最小的一个写入结果文件,并移除该元素。这个过程重复,直到所有块都处理完毕...

    排序分割文件

    通常,Java代码会定义一个类,包含分割文件、对子文件排序以及合并文件的方法。这些方法可能会使用到文件I/O操作,如`java.io`包中的`FileInputStream`、`FileOutputStream`和`BufferedReader`、`BufferedWriter`等...

    互联网大厂Java大数据开发工程师岗位面试真题

    数据先存入内存缓冲区,超过阈值时触发spill,先进行排序(分区+key),然后可能运行combiner进行初步聚合,最后将所有spill文件合并为一个文件。 - Reduce端的Shuffle:Reducer首先复制Map端对应分区的数据,然后...

    广州-唯品会-Java大数据开发面试真题

    Java大数据开发面试题涵盖了许多关键知识点,主要集中在Java编程、大数据技术栈(Hadoop、Spark)、分布式计算和数据处理上。以下是对这些知识点的详细解释: 1. Kafka 消息结构: Kafka的消息由header和body两部分...

    大数据面试题

    ### 大数据面试题知识点详解 #### 一、HDFS数据存储组件理解 - **问题**: 下面哪个程序负责HDFS数据存储? - **选项**: - a) NameNode - b) Jobtracker - c) Datanode - d) secondaryNameNode - e) ...

    切分大的文件以及合并切分的文件2

    "切分大的文件以及合并切分的文件2" 这个项目提供了一种解决方案,它包含了一个名为 `SplitAndCombine` 的Java类及其相关的内部类,用于将大文件分割成小块,并在需要时将这些小块重新组合成原始文件。以下是对这个...

    史上最全的大数据面试题-大数据开发者必看.docx

    - 流数据访问:适合读取大文件,不适合频繁的写入操作。 - 大数据集:适用于存储和处理TB到PB级别的数据。 - **工作原理**: - **NameNode**:主节点,存储元数据(文件系统目录结构、文件与数据块的映射等)。 ...

    《大数据平台搭建与配置管理》期末考试卷及答案.docx

    - **知识点**: 在Map任务全部结束之前,产生的多个溢写文件会在最终被合并成一个大的文件,然后传输给Reduce任务进行处理。 28. **Map任务的缓存** - **知识点**: 每个Map任务都会被分配一个缓存区,Map的输出...

    Hadoop学习总结.doc

    - **namespaceID**:文件系统的唯一标识符,在文件系统初始化时生成。 - **cTime**:通常设置为0。 - **storageType**:指示该文件夹保存的是元数据节点的数据结构。 **1.2.2 文件系统命名空间映像文件及修改日志**...

    hadoop安装及详细学习笔记

    - **文件系统**:HDFS 是一个高度容错性的文件系统,适合一次写入多次读取的场景。 - **NameNode 元数据存储策略**:NameNode 的元数据存储在内存中,定期会将元数据信息持久化到磁盘。 - **DataNode**:DataNode...

    externalSorting

    在Java中实现外部排序,可以利用Java IO流进行文件操作,例如使用`BufferedReader`读取文件,`PrintWriter`写入文件,以及`FileInputStream`和`FileOutputStream`进行低级I/O操作。同时,Java的`PriorityQueue`数据...

    WordCOunt.zip

    这个文件被HDFS分割成多个块,并分布在集群的不同节点上。MapReduce的工作流程分为两个主要阶段:Map阶段和Reduce阶段。 1. **Map阶段**: 在Map阶段,Hadoop将输入文件分块并分配到各个节点上的Mapper任务。...

    Hadoop基础面试题(附答案)

    - **辅助NameNode**:定期合并fsimage文件和editlogs文件,减少NameNode的重启时间。 - **备份fsimage文件**:为NameNode提供故障恢复的能力。 #### 十二、HDFS环境的搭建步骤 1. **安装Java**:Hadoop依赖于Java...

    Hadoop-海量文件的分布式计算处理方案.docx

    - 中间结果通过网络传输到Reducer任务,Reducer先对数据进行排序和合并,然后调用Reducer函数进行处理。 - 最后,Reducer使用OutputFormat将处理结果写入输出文件。 **Hadoop的应用实例**: 这里提到的是一个简单...

    软件工程mapreduce整理.pdf

    5. 输出结果:经过Map和Reduce处理后的结果会被写入到输出文件中。 在上述过程中,Hadoop MapReduce提供了丰富的API供用户使用。例如,用户可以利用Hadoop Streaming通过标准输入输出接口编写非Java Map/Reduce程序...

Global site tag (gtag.js) - Google Analytics