Jak określić Separator KeyValueTextInputFormat w Hadoop-.20 api?

W nowym API (apache.hadoop.mapreduce.KeyValueTextInputFormat), jak określić separator (ogranicznik) inny niż tab (który jest domyślnie), aby oddzielić klucz i wartość.

Przykładowe Wejście:

one,first line
two,second line

Ouput Wymagane:

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

Określam KeyValueTextInputFormat jako:

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

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

To działa dobrze dla tab jako separator.

Author: pradeep, 2012-02-09

6 answers

W nowszym API należy użyć właściwości konfiguracyjnej mapreduce.input.keyvaluelinerecordreader.key.value.separator.

Oto przykład:

Configuration conf = new Configuration();
conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ",");

Job job = new Job(conf);
job.setInputFormatClass(KeyValueTextInputFormat.class);
// next job set-up
 11
Author: fizmax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 15:16:31

W kodzie Sterownika należy wpisać:

conf.set("key.value.separator.in.input.line", ",");
 5
Author: Journey Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-10 23:23:18

Dla KeyValueTextInputFormat linia wejściowa powinna być parą wartości klucza oddzieloną przez "\t "

Key1     Value1,Value2

Zmieniając domyślny separator, będziesz mógł czytać, jak chcesz.

Dla Nowego Api

Oto rozwiązanie

//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());
   .
   .

Wyjście

key---> one
value---> first line
key---> two
value---> second line
 1
Author: Unmesha SreeVeni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 09:34:58

To kwestia sekwencji.

Pierwsza linia {[1] } musi pojawić się przed utworzeniem instancji klasy Job. Więc:

conf.set("key.value.separator.in.input.line", ","); 
Job job = new Job(conf);
 1
Author: Shrikant G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-02 10:21:04

Po pierwsze, nowe API nie skończyło się w 0.20.* więc jeśli chcesz użyć nowego API w 0.20.* , powinieneś zaimplementować tę funkcję samodzielnie.Na przykład można użyć FileInputFormat, aby osiągnąć. Zignoruj klawisz LongWritable i podziel wartość tekstu na przecinek.

 0
Author: owen wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-10 05:39:44

Domyślnie klasa KeyValueTextInputFormat używa tab jako separatora dla klucza i wartości z wejściowego pliku tekstowego.

Jeśli chcesz odczytać dane wejściowe z niestandardowego separatora, musisz ustawić konfigurację z używanym atrybutem.

Dla nowych interfejsów API Hadoop jest inaczej:

conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ";");
 0
Author: ravi ranjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 17:44:54