2012-02-09 8 views
13

En la API nueva (apache.hadoop.mapreduce.KeyValueTextInputFormat), cómo especificar el separador (delimitador) que no sea la pestaña (que es el valor predeterminado) para separar la clave y el valor.Cómo especificar KeyValueTextInputFormat Separador en Hadoop-.20 api?

Ejemplo de entrada:

one,first line 
two,second line 

salida de la señal requerido:

Key : one 
Value : first line 
Key : two 
Value : second line 

Me estoy especificando KeyValueTextInputFormat como:

Job job = new Job(conf, "Sample"); 

    job.setInputFormatClass(KeyValueTextInputFormat.class); 
    KeyValueTextInputFormat.addInputPath(job, new Path("/home/input.txt")); 

Esto funciona bien para la lengüeta como separador.

+0

La respuesta aceptada no está funcionando bien –

+0

@SreeVeni Funciona bien para mí. –

Respuesta

11

En la API más nueva debe usar la propiedad de configuración mapreduce.input.keyvaluelinerecordreader.key.value.separator.

He aquí un ejemplo:

+0

Para una nueva API esto no funcionará. Aquí se tomará toda la línea como clave –

+0

@SreeVeni Funciona bien para mí. –

+0

@ chiastic-security: eso no funcionó para mí, pero esto hizo conf.set ("key.value.separator.in.input.line", ","); –

5

Configure lo siguiente en el código de controlador.

conf.set("key.value.separator.in.input.line", ","); 
+0

Gracias por la respuesta d .. Pero en realidad estoy usando API nueva (Objeto de trabajo en lugar de Objeto JobConf). – pradeep

+0

He actualizado mi solución. –

0

En primer lugar, la nueva API no terminó en 0.20. * Por lo que si desea utilizar la nueva API de 0.20. *, Se debe implementar la función por ejemplo yourself.For puede utilizar FileInputFormat lograr. Ignore la tecla LongWritable y divida el valor de texto en la coma usted mismo.

0

Por defecto, la clase KeyValueTextInputFormat utiliza pestaña como un separador de clave y el valor del archivo de texto de entrada.

Si desea leer la entrada de un separador personalizado, debe configurar la configuración con el atributo que está utilizando.

Para las nuevas API de Hadoop, es diferente:

conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ";"); 
1

Para KeyValueTextInputFormat la línea de entrada debe ser un par de valores clave separados por "\ t"

Key1  Value1,Value2 

Por cambiando el separador predeterminado, podrá leer como lo desee.

Para nueva API

Here is the solution

//New API 
Configuration conf = new Configuration(); 
conf.set("key.value.separator.in.input.line", ","); 
Job job = new Job(conf); 
job.setInputFormatClass(KeyValueTextInputFormat.class); 

Mapa

public class Map extends Mapper<Text, Text, Text, IntWritable> { 
private final static IntWritable one = new IntWritable(1); 
private Text word = new Text(); 

public void map(Text key, Text value, Context context) 
     throws IOException, InterruptedException { 
    String line = value.toString(); 
    System.out.println("key---> "+key); 
    System.out.println("value---> "+value.toString()); 
    . 
    . 

salida

key---> one 
value---> first line 
key---> two 
value---> second line 
1

Es una cuestión de secuencia.

La primera línea conf.set("key.value.separator.in.input.line", ",") debe aparecer antes de crear una instancia de la clase Job.Por lo tanto:

conf.set("key.value.separator.in.input.line", ","); 
Job job = new Job(conf); 
Cuestiones relacionadas