2013-03-07 2 views
2

Я - общий хаоп n00b. Я пытаюсь решить следующее в качестве своего первого проекта suoop. У меня есть миллион + подпапок, сидящих в ведро Amazon S3. Каждая из этих папок имеет два файла. Файл 1 имеет следующие данные:Присоединение двух файлов в том же каталоге с использованием hadoop

date,purchaseItem,purchaseAmount 
01/01/2012,Car,12000 
01/02/2012,Coffee,4 
.................... 

File2 имеет информацию о клиенте в следующем формате:

ClientId:Id1 
ClientName:"SomeName" 
ClientAge:"SomeAge" 

Эта же картина повторяется во всех папках в ведре.

Перед тем, как написать все эти данные в HDFS, я хочу присоединиться к File1 и File2 следующим образом:

Регистрация файла:

ClientId,ClientName,ClientAge,date,purchaseItem,purchaseAmount 
Id1,"SomeName","SomeAge",01/01/2012,Car,12000 
Id1,"SomeName","SomeAge",01/02/2012,Coffee,4 

мне нужно сделать это для каждой папки, а затем кормить этот объединенный набор данных в HDFS. Может кто-нибудь указать, как я смогу добиться чего-то подобного в Hadoop. Толчок в правильном направлении будет высоко оценен.

+0

Может быть, вы можете рассмотреть, загружая эти файлы в РСУБД базы данных MySQL, как программно, присоединить их к столу в этой БД и сбрасывать эту таблицу HDFS с помощью Sqoop. Я думаю, это очень прямолинейно. – Alper

+0

@Alper - Спасибо. Я думал больше о том, чтобы иметь задание карты, чтобы определить имена файлов, которые являются некоторыми/path/to/file1, а некоторые/path/to/file2.«Some/path/to» можно, вероятно, использовать в качестве ключа, и значение будет линией для File1 и проанализированным контентом для File2. В фазе сокращения я думал, можно ли присоединиться к записям на основе ключа «some/path/to». Я практически ничего не знаю о Map-reduce, поэтому, возможно, это не путь. –

+0

Вы должны быть осторожны с тем, как использовать задания hadoop и mapreduce, Hadoop делает свою магию, когда у вас есть файл с большим контентом в hdf. Я не мог понять ваш путь, но перемещение ваших файлов в систему hdfs, по-видимому, не подходит для решения mapreduce. – Alper

ответ

3

Что приходит на ум быстро, это реализация в каскадировании.

Придумайте способ превратить ваши строки в столбцы для File2 программно, чтобы вы могли перебирать все папки и перенести файл так, чтобы ваш 1-й столбец был вашей первой строкой.

только для одной вложенных: Возможно создание два схем TextDelimited схемы File 1 и TextLine схемы файла 2. Установите эти вверх, как Taps затем оберните каждый из них в MultiSourceTap этом сцепляет все эти файлы в один Pipe ,

На этом этапе у вас должно быть два отдельных MultiSourceTaps один для всех файлов File1 (s) и один для всех файлов File2 (s). Помните о некоторых деталях между ними, может быть, лучше всего установить это для одной подпапки, а затем повторить по другим миллионам подпапок и вывести их в какую-либо другую область, а затем использовать hadoop fs -getmerge, чтобы получить все выходные мелкие файлы в один большой.

Держа с темой каскадной, то можно построить Pipe с, чтобы добавить имя подпапки, используя new Insert(subfolder_name) внутри и Each функции так, чтобы оба ваших наборы данных имеют ссылки на вложенную она пришла к ним присоединиться вместе, то ... Присоединяйтесь к ним, используя каскадные CoGroup или Hive-QL Join.

Это может быть намного проще, чем это, но это то, что приходит на ум быстро. :)

TextDelimited, TextLine, MultiSourceTap

+0

Это выглядит многообещающе. Благодаря! –

+0

Рад, что вы сочли это полезным! – Engineiro

0

Посмотрите на CombineFileInputFormat.

+0

Спасибо. Можете ли вы кратко объяснить, как класс CombineFileInputFormat может помочь мне здесь? –

Смежные вопросы