2015-03-05 2 views
2

Мое задание hadoop должно знать входной путь, из которого происходит каждая запись.Hadoop InputFormat set Ключ к пути входного файла

Например предположим, я бегу на работу по набору объектов S3:

s3://bucket/file1 
s3://bucket/file2 
s3://bucket/file3 

Я хотел бы уменьшить ключевые пары значений, таких как

s3://bucket/file1 record1 
s3://bucket/file1 record2 
s3://bucket/file2 record1 
... 

Есть ли расширение org.apache.hadoop.mapreduce.InputFormat что выполнит это? Или есть лучший способ сделать это, чем использовать пользовательский формат ввода?

Я знаю, что в картографа эта информация доступна из MapContext (How to get the input file name in the mapper in a Hadoop program?), но я использую Apache хруст, и я не могу контролировать, будет ли какой-либо из моих шагов будет Maps или уменьшает, однако я могу надежно контролировать InputFormat так что это Мне показалось, что это место для этого.

ответ

1

Пожалуйста, взгляните на my blog article to customize inputsplit and recordreader.

Код в этом блоге устанавливает ключ, как показано ниже (строка 69-70 из recordreader кода)

value = new Text(line); 
key = new LongWritable(splitstart); 

В вашем случае вам необходимо установить ключ, как показано ниже, я не проверял, хотя.

key = fsplit.getPath().toString(); 
+0

Спасибо, я думаю, что закончил писать свои собственные, как вы описали. Если кто-то читает его, пинги меня и плохо выкапывают и публикуют. – qwwqwwq