Java Hadoop将数据附加到hdfs文件并忽略重复条目

Java Hadoop将数据附加到hdfs文件并忽略重复条目,java,hadoop,mapreduce,hive,hdfs,Java,Hadoop,Mapreduce,Hive,Hdfs,如何将数据附加到HDFS文件并忽略重复值 我有一个巨大的HDFS文件MainFile,还有另外两个来自不同来源的新文件,我想把这些文件中的数据附加到MainFile中 主文件和其他文件具有相同的结构。您可以创建mapreduce作业来合并hdfs中的文件,或者使用“读取其他文件并写入主文件”: FileSystem fs = FileSystem.get(new Configuration()); FileStatus[] status = fs.listStatus(new Path(/*2

如何将数据附加到HDFS文件并忽略重复值

我有一个巨大的HDFS文件MainFile,还有另外两个来自不同来源的新文件,我想把这些文件中的数据附加到MainFile中


主文件和其他文件具有相同的结构。

您可以创建mapreduce作业来合并hdfs中的文件,或者使用“读取其他文件并写入主文件”:

FileSystem fs = FileSystem.get(new Configuration());
FileStatus[] status = fs.listStatus(new Path(/*2 other files*/));
for (int i=0;i<status.length;i++){
    BufferedReader br=new BufferedReader(new InputStreamReader(fs.open(status[i].getPath())));
    String line;
    line=br.readLine();
    while (line != null){
        line=br.readLine();
        BufferedWriter br=new BufferedWriter(new OutputStreamWriter(fs.append(/*main file*/));
        br.write(line);
        br.close();
    }
}

由于HDFS只用于一次写入,因此需要多次读取。我们无法更改Hdfs文件的内容。您正试图将数据附加到hdfs中的文件中。将文件复制到HDFS中,然后可以使用-getmerge实用程序

hadoop fs-getmerge[addnl]


使用map reduce的另一个解决方案是:将新文件作为分布式缓存文件,它应该放入内存中,读取hdfs中已有的文件,并在map方法中比较记录。

谢谢,但将文件与mapreduce合并的主要思想是什么?我没有找到合并文件的解决方案。我认为您必须读取映射器中的所有文件,并在ReducerHanks中构建新文件。是否有任何解决方案使用配置单元来防止重复键值,在我的示例中,我有Key1、Key2、,值1,值2,。。。。值n每行,如果我使用主文件创建一个外部配置单元表,并将新的源附加到配置单元表中会怎么样。如果将数据附加到配置单元表中,则不会删除重复项。它只会将它附加到你的配置单元表中。看,我有一个主文件,它的结构是Key1,Key2,值1,值2,。。。。值n和从extern源提取的第二个文件以及从我的RDBMS数据库提取的另一个文件所有文件都具有相同的结构,我只想将唯一的数据附加到主文件中,删除每个重复键的旧值并保留最新值。将所有三个文件作为mapreduce程序的输入,在mapper中,将您的键作为HBASE表的行键插入,每次先将其与HBASE行键进行比较,然后如果匹配则其存在,如果不匹配则其新键。