2 votes

Traitement des données non structurées avec Hadoop + MapReduce

Je voudrais utiliser hadoop pour traiter des fichiers CSV non structurés. Ces fichiers sont non structurés dans le sens où ils contiennent plusieurs valeurs de données de différents types avec des longueurs de lignes variables. De plus, il y a des centaines de ces fichiers et ils sont souvent de taille relativement importante (> 200Mb).

La structure de chaque fichier peut être démontrée comme suit :

Book     , ISBN          , BookName                     , Authors    , Edition
Book     , 978-1934356081, Programming Ruby 1.9         , Dave Thomas, 1
Book     , 978-0596158101, Programming Python           , Mark Lutz  , 4
...
BookPrice, ISBN          , Store                        , Price
BookPrice, 978-1934356081, amazon.com                   , 30.0
BookPrice, 978-1934356081, barnesandnoble.com           , 30.67
BookPrice, 978-0596158101, amazon.com                   , 39.55
BookPrice, 978-0596158101, barnesandnoble.com           , 44.66
...
Book     , ISBN          , BookName                     , Authors    , Edition
Book     , 978-1449311520, Hadoop - The Definitive Guide, Tom White  , 3
...

Les fichiers sont générés automatiquement, et je n'ai aucun contrôle sur la structure donnée. En gros, il y a une ligne d'en-tête suivie de lignes de données contenant des valeurs correspondant aux en-têtes. Le type de ligne peut être identifié par le premier mot séparé par une virgule. Ainsi, dans l'exemple, la ligne Book contient des métadonnées sur les livres (nom, isbn, auteur, édition), et la rangée BookPrice contient les différents prix des livres pour les différents points de vente/vendeurs.

J'essaie de comprendre comment utiliser Map/Reduce pour effectuer certains calculs agrégés sur les données. La structure actuelle des données rend plus difficile la compréhension de ce qu'il faut faire. key -> value paires à extraire dans chaque phase.

Par exemple, je voudrais calculer les MOYENNE , MAX y MIN les prix de chaque livre (peuvent être joints/groupés par ISBN). Je me rends compte que je peux faire un prétraitement pour extraire ces données dans des fichiers CSV ordonnés et d'un seul type et travailler à partir de là (en utilisant grep, python, awk, etc.), mais cela va à l'encontre de l'intérêt d'utiliser M/R+Hadoop, et nécessitera beaucoup de travail supplémentaire.

J'ai pensé à utiliser plusieurs étapes de la carte, mais je suis assez novice dans ce domaine et je ne sais pas trop par où commencer.

Comment puis-je mettre en œuvre un tel travail M/R (en Java) pour le fichier/la requête type ? Merci.

3voto

David Gruzman Points 5129

J'ai été confronté à un cas un peu similaire et j'ai fait la conception suivante :
J'ai développé un format d'entrée qui utilise l'analyseur OpenCSV pour diviser les enregistrements. Ensuite, j'ai rempli MapWritable comme valeur. Chaque carte contient un enregistrement avec des entrées "fieldName->field value".
Dans votre cas, je ferais de la clé quelque chose comme un énumérateur contenant un type d'enregistrement comme "enregistrement de prix", "enregistrements d'auteurs", etc.

Ensuite, dans votre mappeur, vous pouvez écrire un code relativement simple qui reconnaîtra les enregistrements intéressants et les regroupera.

Une méthode un peu plus compliquée mais plus gratifiante serait de créer SerDe pour le répertoire de stockage qui mappera les fichiers dans une table de structure : type d'enregistrement (décrit ci-dessus) et colonnes KeyValueMap. (Hive supporte le type de carte pour la colonne). Ensuite, vous seriez en mesure de faire des SQLs contre vos données semi-structurées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X