2009-07-20 17 views
1

Je suis un programmeur .NET qui fait du travail Hadoop en Java et je suis un peu perdu ici. Dans Hadoop, j'essaie de configurer un travail Map-Reduce où la clé de sortie du travail Map est du type Tuple<IntWritable,Text>. Quand je tournerai la clé de sortie en utilisant setOutputKeyclass comme suitJava Generics & Hadoop: comment obtenir une variable de classe

JobConf conf2 = new JobConf(OutputCounter.class); 
conf2.setOutputKeyClass(Tuple<IntWritable,Text>.class); 

Je reçois un tas d'erreurs parce que les génériques et la notation « .class » ne semblent pas voler. Ce qui suit fonctionne bien cependant

JobConf conf2 = new JobConf(OutputCounter.class); 
conf2.setOutputKeyClass(IntWritable.class); 

Quelqu'un at-il des pointeurs sur la façon de définir la classe de clé de sortie?

Cheers, Jurgen

Répondre

4

En Java, les génériques sont effacés au moment de la compilation, de sorte que le mieux que vous pouvez faire est:

conf2.setOutputKeyClass(Tuple.class); 

Si vous le pouvez, pour faire de ce mieux, vous pouvez sous-classe Tuple à Gardez un type au moment de l'exécution:

public class IntWritableTextTuple extends Tuple<IntWritable, Text> {} 

Puis utilisez-le comme paramètre pour setOutputKeyClass. Notez, je ne sais rien à propos de Hadoop, donc cela n'a aucun sens ici, mais en général avec Java Generics, c'est ce que vous faites.

+0

Oui, c'est le meilleur que je pourrais trouver, aussi. –

+0

Je crois étendre un type générique sans corps comme vous le montrez dans 'IntWritableTextTuple' juste pour contourner ces erreurs en décourageant. –

+1

Je pense que décourager un modèle est bien - si vous présentez une alternative. Ici, il n'y a pas d'alternative, alors que pouvez-vous faire d'autre? – Yishai

Questions connexes