Cómo convertir un archivo .txt al formato de archivo de secuencia de Hadoop

Para utilizar efectivamente los trabajos de reducción de mapas en Hadoop , necesito que los datos se almacenen en el formato de archivo de secuencia de hadoop . Sin embargo, actualmente los datos solo están en formato .txt plano. ¿Alguien puede sugerir una forma de convertir un archivo .txt a un archivo de secuencia?

Entonces, la forma más simple de respuesta es simplemente un trabajo de “identidad” que tiene un resultado SequenceFile.

Se ve así en 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); } } } 

Depende de cuál sea el formato del archivo TXT. ¿Es una línea por registro? Si es así, simplemente puede usar TextInputFormat que crea un registro para cada línea. En tu mapeador puedes analizar esa línea y usarla de la forma que elijas.

Si no es una línea por registro, es posible que deba escribir su propia implementación InputFormat. Eche un vistazo a este tutorial para obtener más información.

También puede simplemente crear una tabla intermedia, CARGAR DATOS los contenidos CSV directamente en ella, luego crear una segunda tabla como secuencia de archivos (particionados, en clúster, etc.) e insertar en seleccionar de la tabla intermedia. También puede establecer opciones para la compresión, por ejemplo,

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

El framework MR se encargará del heavylifting por usted, ahorrándole la molestia de tener que escribir el código Java.

Si sus datos no están en HDFS, debe cargarlos en HDFS. Dos opciones:

i) hdfs -put en su archivo .txt y una vez que lo obtiene en HDFS, puede convertirlo a un archivo seq.

ii) Toma el archivo de texto como entrada en su cuadro de cliente HDFS y lo convierte a SeqFile utilizando las API de archivo de secuencia creando un SequenceFile.Writer y anexándolo (clave, valores).

Si no le importa la clave, puede hacer que el número de línea sea la clave y completar el texto como valor.

si tiene Mahout instalado, tiene algo llamado: seqdirectory, que puede hacerlo