Mappeur entrée paire valeur-clé dans Hadoop
Normalement, nous écrivons le mappeur dans la forme :
public static class Map extends Mapper<**LongWritable**, Text, Text, IntWritable>
Ici l'entrée de paires clé-valeur pour le mappeur est <LongWritable, Text>
- autant que je sache, lorsque le mappeur obtient les données d'entrée de son passe à travers la ligne de ligne, de sorte que la Clé pour le mappeur indique le numéro de la ligne - s'il vous plaît corrigez-moi si je me trompe.
Ma question est : Si je donne l'entrée de paires clé-valeur pour mapper comme <Text, Text>
puis c'est ce qui donne l'erreur
java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text
Est-il obligatoire de donner à l'entrée de paires clé-valeur de mapper comme <LongWritable, Text>
- si oui, alors pourquoi ? si non alors quelle est la raison de l'erreur ? Pouvez-vous svp m'aider à comprendre le bon raisonnement de l'erreur ?
Merci d'avance.
source d'informationauteur Ronin
Vous devez vous connecter pour publier un commentaire.
L'entrée pour le mappeur dépend de ce que InputFormat est utilisé. Le InputFormat est responsable de la lecture des données entrantes et de la transformer en n'importe quel format que le Mappeur attend.La valeur par défaut InputFormat est TextInputFormatqui s'étend
FileInputFormat<LongWritable, Text>
.Si vous ne changez pas la InputFormat, à l'aide d'un Mappeur avec différentes Clés-type de la Valeur de la signature de
<LongWritable, Text>
de provoquer cette erreur. Si vous vous attendez à<Text, Text>
entrée, vous aurez à choisir un approprié InputFormat. Vous pouvez définir la InputFormat dans la configuration de la Tâche:Et comme je l'ai dit, par défaut elle est réglée à TextInputFormat.
Maintenant, disons que vos données d'entrée est un tas de saut de ligne séparée dossiers délimités par une virgule:
Si vous voulez la clé d'entrée pour le mappeur ("Un", "valeur1"), ("B", "valeur2"), vous aurez à mettre en œuvre une coutume InputFormat et RecordReader avec le
<Text, Text>
signature. Heureusementc'est assez facile. Il est un exemple ici et probablement quelques exemples flottant autour de StackOverflow.En bref, ajouter une classe qui étend
FileInputFormat<Text, Text>
et une classe qui étendRecordReader<Text, Text>
. Remplacer leFileInputFormat#getRecordReader
méthode, et de retourner une instance de votre personnalisé RecordReader.Ensuite, vous aurez à mettre en œuvre les RecordReader logique. La façon la plus simple de faire cela est de créer une instance de LineRecordReader dans votre personnalisé RecordReader, et de déléguer toutes les responsabilités de base à cette instance. Dans le getCurrentKey et getCurrentValue-méthodes vous permettra de mettre en œuvre la logique d'extraction de Texte délimité par des virgules contenu en appelant
LineRecordReader#getCurrentValue
et le fractionnement sur la virgule.Enfin, réglez votre nouvelle InputFormat de l'Emploi InputFormat comme indiqué après le deuxième alinéa ci-dessus.
Dans le livre "Hadoop: Le Difinitive Guide" par Tom White je pense qu'il a une réponse appropriée à cette(pg. 197):
"TextInputFormat de l'
touches, étant simplement l'offset dans le fichier, ne sont normalement pas très
utile. Il est commun pour chaque ligne dans un fichier à une paire clé-valeur, séparées par un délimiteur
comme un caractère de tabulation. Par exemple, c'est la sortie produite par
TextOutputFormat, Hadoop par défaut
OutputFormat. Pour interpréter correctement les fichiers,
KeyValueTextInputFormat
est approprié.
Vous pouvez spécifier le séparateur par l'
clé.de la valeur.séparateur.dans.d'entrée.ligne
de la propriété. Il
est un caractère de tabulation par défaut."
Clé pour Mapper l'Entrée sera toujours un Entier de type....le mappeur de la touche d'entrée indique la ligne du décalage à pas. et les valeurs indique l'ensemble de la ligne ......
enregistrement lecteur lit une seule ligne dans le premier cycle. Et o/p de le mapper peut-être ce que tu veux (il peut être (Texte,Texte) ou (Texte, IntWritable) ou ......)