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