Подтвердить что ты не робот

Как преобразовать файл .txt в формат файла последовательности Hadoop

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

4b9b3361

Ответ 1

Таким образом, более простой ответ - это просто задание "identity", которое имеет выход 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);
   }

Ответ 2

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); 
        } 
    } 
}

Ответ 3

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

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

Ответ 4

Вы также можете просто создать промежуточную таблицу, LOAD DATA, содержимое csv прямо в нее, а затем создать вторую таблицу как файл последовательности (секционированный, кластерный и т.д.) и вставить в выборку из промежуточной таблицы. Вы также можете установить параметры сжатия, например,

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.

Ответ 5

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

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

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

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

Ответ 6

если у вас установлен Mahout - у него есть что-то, называемое: seqdirectory - который может это сделать

Ответ 7

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

Например (обратите внимание на пробел между % и 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);