Quelques approches, certains plus sale que d'autres:
La bonne façon
Vous devrez peut-être définir votre propre RecordReader, InputSplit et InputFormat. Selon exactement ce que vous essayez de faire, vous serez en mesure de réutiliser certains des déjà existants des trois ci-dessus. Vous devrez probablement écrire votre propre RecordReader pour définir la paire clé/valeur et vous devrez probablement écrire votre propre InputSplit pour aider à définir la limite.
Une autre bonne façon, qui peut ne pas être possible
La tâche ci-dessus est assez intimidante. Avez-vous un contrôle sur votre ensemble de données? Pouvez-vous le pré-traiter d'une façon ou d'une autre (soit pendant qu'il arrive ou au repos)? Si c'est le cas, vous devriez envisager sérieusement de transformer votre jeu de données en quelque chose de plus facile à lire dans Hadoop.
Quelque chose comme:
ALine1
ALine2 ALine1;Aline2;Aline3;Aline4
ALine3
ALine4 ->
BLine1
BLine2 BLine1;Bline2;Bline3;Bline4;
BLine3
BLine4
Down and Dirty
Avez-vous un contrôle sur la taille des fichiers de vos données? Si vous divisez manuellement vos données sur la limite du bloc, vous pouvez forcer Hadoop à ne pas tenir compte des enregistrements couvrant des divisions. Par exemple, si la taille de votre bloc est de 64 Mo, écrivez vos fichiers en morceaux de 60 Mo. Sans vous soucier des divisions d'entrée, vous pourriez faire quelque chose de sale: Dans votre fonction de carte, ajoutez votre nouvelle paire clé/valeur dans un objet de liste. Si l'objet liste contient 4 éléments, effectuez le traitement, émettez quelque chose, puis nettoyez la liste. Sinon, n'émet rien et continue sans rien faire.
La raison pour laquelle vous devez diviser manuellement les données est que vous ne serez pas certain qu'un enregistrement entier à 4 lignes sera attribué à la même tâche cartographique.
Merci pour votre réponse, je pensais à la deuxième approche que vous suggérez, mais est-ce pas aussi criblé avec le même problème? Comment lire quatre lignes à la fois pour les joindre et créer une seule ligne? – Gitmo
Vous pourriez écrire quelque chose en Perl ou en Python qui pourrait faire l'affaire. C'est ce que j'avais en tête. –
Utilisez [SequenceFile] (http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/io/SequenceFile.html) avec compression pour obtenir de meilleures performances si le pré-traitement du fichier est terminé . –