Hadoop 将数据附加到 hdfs 文件并忽略重复条目
Hadoop append data to hdfs file and ignore duplicate entries
如何将数据附加到 HDFS 文件并忽略重复值?
我有一个巨大的 HDFS 文件 (MainFile),我还有 2 个来自不同来源的新文件,我想将这些文件中的数据附加到 MainFile。
主文件和其他文件具有相同的结构。
您可以编写 mapreduce 作业来合并 hdfs 中的文件,或者使用读取“2 个其他文件”并写入 "MainFile":
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 方法中比较记录。
如何将数据附加到 HDFS 文件并忽略重复值?
我有一个巨大的 HDFS 文件 (MainFile),我还有 2 个来自不同来源的新文件,我想将这些文件中的数据附加到 MainFile。
主文件和其他文件具有相同的结构。
您可以编写 mapreduce 作业来合并 hdfs 中的文件,或者使用读取“2 个其他文件”并写入 "MainFile":
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 方法中比较记录。