Come convertire il file .txt nel formato di file di sequenza di Hadoop

Per utilizzare in modo efficace i lavori di riduzione della mappa in Hadoop , ho bisogno che i dati vengano memorizzati nel formato file sequenza di hadoop . Tuttavia, attualmente i dati sono solo in formato .txt piatto. Qualcuno può suggerire un modo in cui posso convertire un file .txt in un file di sequenza?

Quindi il modo in cui la risposta più semplice è solo un lavoro di “identity framework” che ha un output SequenceFile.

Assomiglia a questo in 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); } } } 

Dipende da cosa è il formato del file TXT. È una riga per record? In tal caso, puoi semplicemente utilizzare TextInputFormat che crea un record per ogni riga. Nel tuo mapper puoi analizzare quella linea e usarla in qualsiasi modo tu scelga.

Se non è una riga per record, potrebbe essere necessario scrivere la propria implementazione InputFormat. Dai un’occhiata a questo tutorial per maggiori informazioni.

Puoi anche solo creare una tabella intermedia, CARICARE DATI il contenuto di csv direttamente in essa, quindi creare una seconda tabella come file di sequenza (partizionato, in cluster, ecc.) E inserirla nella selezione dalla tabella intermedia. Puoi anche impostare le opzioni per la compressione, ad es.

 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 ...; 

Il framework MR si occuperà quindi del sollevamento pesi per te, risparmiandoti la fatica di dover scrivere codice Java.

Se i tuoi dati non sono su HDFS, devi caricarli su HDFS. Due opzioni:

i) hdfs -put sul tuo file .txt e una volta ottenuto su HDFS, puoi convertirlo in file seq.

ii) Si prende il file di testo come input nella casella del client HDFS e si converte in SeqFile usando le API del file di sequenza creando un SequenceFile.Writer e aggiungendo (chiave, valori) ad esso.

Se non ti interessa la chiave, puoi rendere il numero di riga come chiave e completare il testo come valore.

se hai installato Mahout – ha qualcosa chiamato: seqdirectory – che può farlo