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

Java 如何将.txt文件转换为Hadoop的序列文件格式,java,file,hadoop,type-conversion,hive,Java,File,Hadoop,Type Conversion,Hive,为了在中有效利用map减少作业,我需要将数据存储在中。但是,目前数据仅为flat.txt格式。有人能建议我如何将.txt文件转换为序列文件吗?这取决于txt文件的格式。每条记录一行吗?如果是这样,您可以简单地使用TextInputFormat,它为每行创建一条记录。在映射器中,您可以解析该行并以您选择的任何方式使用它 如果不是每条记录一行,您可能需要编写自己的InputFormat实现。查看更多信息。因此,更简单的答案只是一个具有SequenceFile输出的标识作业。 在java中看起来像这样

为了在中有效利用map减少作业,我需要将数据存储在中。但是,目前数据仅为flat.txt格式。有人能建议我如何将.txt文件转换为序列文件吗?

这取决于txt文件的格式。每条记录一行吗?如果是这样,您可以简单地使用TextInputFormat,它为每行创建一条记录。在映射器中,您可以解析该行并以您选择的任何方式使用它


如果不是每条记录一行,您可能需要编写自己的InputFormat实现。查看更多信息。

因此,更简单的答案只是一个具有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);
   }

如果您的数据不在HDFS上,则需要将其上载到HDFS。两种选择:

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

在HDFS客户端框上输入文本文件,通过创建SequenceFile.Writer并向其添加键和值,使用序列文件API将其转换为SeqFile


如果您不关心键,您可以将行号作为键,将完整文本作为值。

您也可以创建一个中间表,将csv内容的数据直接加载到其中,然后创建第二个表作为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代码的麻烦。

如果您安装了Mahout,它有一个名为:seqdirectory的东西,可以执行此操作。

请注意格式说明符:

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); 
        } 
    } 
}
例如,请注意%s和System.out.printf[%s]\t%s\t%s\n之间的空格,writer.getLength,key,value;将为我们提供java.util.FormatFlagsConversionMismatchException:Conversion=s,标志=

相反,我们应该使用:

System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value); 

我需要使用第一个选项。我该怎么做呢?所以,如果我有100个.txt文件,这会给我100个.seq文件,对吗?如果我想要一个大的.seq文件呢?我猜是:job.setNumReduceTasks1;我在尝试编写时遇到一个错误:addInputPaths参数的类型必须是Conf或JobConf,而不是Job。如果我将Job更改为JobConf,setMapperClass和setReducerClass方法将不可用。这里的uri是什么?