Как преобразовать файл .txt в формат файла последовательности Hadoop - PullRequest
31 голосов
/ 21 марта 2011

Чтобы эффективно использовать задания уменьшения карты в Hadoop , мне нужно хранить данные в формате файла последовательности hadoop .Однако в настоящее время данные представлены только в плоском формате .txt. Кто-нибудь может предложить способ преобразования файла .txt в файл последовательности?

Ответы [ 7 ]

32 голосов
/ 21 марта 2011

Таким образом, самый простой ответ - это просто «идентификационная» работа с выходом 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);
   }
16 голосов
/ 30 августа 2012
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); 
        } 
    } 
}
7 голосов
/ 21 марта 2011

Зависит от формата файла TXT. Это одна строка на запись? Если это так, вы можете просто использовать TextInputFormat, который создает одну запись для каждой строки. В вашем картостроителе вы можете анализировать эту строку и использовать ее по своему выбору.

Если это не одна строка на запись, вам может потребоваться написать собственную реализацию InputFormat. Посмотрите этот урок для получения дополнительной информации.

4 голосов
/ 17 января 2012

Вы также можете просто создать промежуточную таблицу, ЗАГРУЗИТЬ ДАННЫЕ непосредственно в нее содержимого csv, затем создать вторую таблицу как файл последовательности (разделенный, кластеризованный и т. Д.) И вставить в 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.

1 голос
/ 31 января 2019

Будьте внимательны с указателем формата :.

Например (обратите внимание на пробел между % и s), System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value); даст нам java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags =

Вместо, мы должны использовать:

System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value); 
0 голосов
/ 03 июня 2014

если у вас установлен Mahout - он называется: seqdirectory - что может сделать это

0 голосов
/ 31 марта 2011

Если ваши данные не в HDFS, вам необходимо загрузить их в HDFS. Два варианта:

i) hdfs -put для вашего файла .txt, и как только вы загрузите его в HDFS, вы можете преобразовать его в файл seq.

ii) Вы берете текстовый файл в качестве ввода в поле клиента HDFS и конвертируете его в SeqFile с помощью API-файлов Sequence File, создавая SequenceFile.Writer и добавляя к нему (ключ, значения).

Если вам не важен ключ, вы можете сделать номер строки в качестве ключа и полный текст в качестве значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...