Référencez une classe imbriquée java dans Spark Scala
J'essaie de lire certaines données de hadoop dans un RDD dans Spark en utilisant le shell Scala interactif mais j'ai du mal à accéder à certaines des classes dont j'ai besoin pour désérialiser les données.
Je commence par importer la classe nécessaire
import com.example.ClassA
Qui fonctionne bien. {[5] } est situé dans un jar dans le chemin 'jars' et a ClassB
en tant que classe imbriquée statique publique
J'essaie ensuite d'utiliser ClassB
comme ceci:
val rawData = sc.newAPIHadoopFile(dataPath, classOf[com.exmple.mapreduce.input.Format[com.example.ClassA$ClassB]], classOf[org.apache.hadoop.io.LongWritable], classOf[com.example.ClassA$ClassB])
Ceci est légèrement compliqué par l'une des autres classes prendre ClassB
comme un type, mais je pense que cela devrait être bien.
Lorsque j'exécute cette ligne, j'obtiens l'erreur suivante:
<console>:17: error: type ClassA$ClassB is not a member of package com.example
J'ai aussi essayé d'utiliser l'instruction d'importation
import com.example.ClassA$ClassB
Et cela semble aussi bien avec cela.
Tout conseil sur la façon dont je pourrais procéder au débogage serait apprécié
Merci d'avoir lu.
Mise à jour:
Changer le '$' en a '.'pour référencer la classe imbriquée semble dépasser ce problème, bien que j'aie ensuite obtenu le erreur de syntaxe suivante:
'<console>:17: error: inferred type arguments [org.apache.hadoop.io.LongWritable,com.example.ClassA.ClassB,com.example.mapreduce.input.Format[com.example.ClassA.ClassB]] do not conform to method newAPIHadoopFile's type parameter bounds [K,V,F <: org.apache.hadoop.mapreduce.InputFormat[K,V]]
1 answers
Notez les types que le newAPIHadoopFile
attend:
K,V,F <: org.apache.hadoop.mapreduce.InputFormat[K,V]
La partie importante ici est que le type générique InputFormat
attend les types K
et V
, c'est-à-dire les types exacts des deux premiers paramètres de la méthode.
, Dans votre cas, le troisième paramètre doit être de type
F <: org.apache.hadoop.mapreduce.InputFormat[LongWritable, ClassA.ClassB]
Votre classe étend-elle FileInputFormat<LongWritable, V>
?