如何将.txt文件转换为Hadoop的序列文件格式

为了有效地利用Hadoop中的 map-reduce作业,我需要将数据存储在hadoop的序列文件格式中 。 然而,目前的数据只是平坦的.txt格式。任何人都可以提出一种方法,我可以将.txt文件转换为序列文件?

所以最简单的答案只是一个具有SequenceFile输出的“身份”作业。

在java中看起来像这样:

public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { Configuration conf = new Configuration(); Job job = new Job(conf); job.setJobName("Convert Text"); job.setJarByClass(Mapper.class); job.setMapperClass(Mapper.class); job.setReducerClass(Reducer.class); // increase if you need sorting or a special number of files job.setNumReduceTasks(0); job.setOutputKeyClass(LongWritable.class); job.setOutputValueClass(Text.class); job.setOutputFormatClass(SequenceFileOutputFormat.class); job.setInputFormatClass(TextInputFormat.class); TextInputFormat.addInputPath(job, new Path("/lol")); SequenceFileOutputFormat.setOutputPath(job, new Path("/lolz")); // submit and wait for completion job.waitForCompletion(true); } 
 import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.Text; //White, Tom (2012-05-10). Hadoop: The Definitive Guide (Kindle Locations 5375-5384). OReilly Media - A. Kindle Edition. public class SequenceFileWriteDemo { private static final String[] DATA = { "One, two, buckle my shoe", "Three, four, shut the door", "Five, six, pick up sticks", "Seven, eight, lay them straight", "Nine, ten, a big fat hen" }; public static void main( String[] args) throws IOException { String uri = args[ 0]; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create( uri), conf); Path path = new Path( uri); IntWritable key = new IntWritable(); Text value = new Text(); SequenceFile.Writer writer = null; try { writer = SequenceFile.createWriter( fs, conf, path, key.getClass(), value.getClass()); for (int i = 0; i < 100; i ++) { key.set( 100 - i); value.set( DATA[ i % DATA.length]); System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value); writer.append( key, value); } } finally { IOUtils.closeStream( writer); } } } 

这取决于TXT文件的格式是什么。 每logging一行吗? 如果是这样,你可以简单地使用TextInputFormat,它为每一行创build一个logging。 在您的映射器中,您可以parsing该行,并以您select的方式使用它。

如果它不是每条logging一行,则可能需要编写自己的InputFormat实现。 看看这个教程了解更多信息。

你也可以直接创build一个中间表,将其中的csv内容直接加载到中间表中,然后创build第二个表作为sequencefile(分区,聚集等),并插入到中间表中进行select。 您还可以设置压缩选项,例如,

 set hive.exec.compress.output = true; set io.seqfile.compression.type = BLOCK; set mapred.output.compression.codec = org.apache.hadoop.io.compress.SnappyCodec; create table... stored as sequencefile; insert overwrite table ... select * from ...; 

然后,MR框架将为您处理重叠,节省您不得不编写Java代码的麻烦。

如果您的数据不在HDFS上,则需要将其上传到HDFS。 两个选项:

i)hdfs -put在你的.txt文件上,一旦你在HDFS上得到它,你可以把它转换成seq文件。

ii)在HDFS客户端框中input文本文件作为input,并通过创buildSequenceFile.Writer并向其添加(键值)来使用序列文件API将其转换为SeqFile。

如果你不在乎钥匙,你可以把行号作为钥匙,把完整的文字作为价值。

如果你有Mahout安装 – 它有一个名为:seqdirectory – 可以做到这一点