2011-03-21 23 views

Respuesta

31

Así que la respuesta más simple es solo un trabajo de "identidad" que tiene un resultado de SequenceFile.

es la siguiente con 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); 
    } 
+1

Por lo tanto, si tengo 100 archivos .txt esto me dará 100 .seq, ¿verdad? ¿Qué pasa si quiero 1 gran archivo .seq? – dranxo

+10

Supongo que: job.setNumReduceTasks (1); – dranxo

+0

@rcompton sí exactamente –

6

Depende del 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 al this tutorial para más información.

0

Si los datos no está en HDFS, es necesario cargarlo en HDFS. Dos opciones:

i) hdfs: ingrese su archivo .txt y una vez que lo obtenga 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.

+1

Necesito usar la primera opción. ¿Cómo puedo hacerlo? – zohar

4

También puede simplemente crear una tabla intermedia, CARGAR DATOS el contenido del CSV directamente en él, luego crear una segunda tabla como archivo de secuencia (particionado, agrupado, etc.) e insertarlo en la selección de la tabla intermedia. También puede definir las opciones de 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 marco MR entonces hacerse cargo de la heavylifting para usted, que le ahorra la molestia de tener que escribir código Java.

14
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); 
     } 
    } 
} 
+0

ejemplo bueno y simple! – user249654

+0

¿Qué es uri está aquí? –

0

si ha instalado Mahout - ha llamado algo: seqdirectory - que puede hacerlo

Cuestiones relacionadas