2016-12-28 3 views
0

Ich muss folgende Operation ausführen: Auswahl jedes Feld in der RDD. Ich habe es in Scala konvertieren, expecially das Teil in der dritten Zeile, Auswählen jeder Spalte:Auswahl der Spalte RDD scala-spark

val rddHash=x.map(row =>(DigestUtils.sha1Hex(row(0).toString.getBytes("UTF-8")),row(1).toString)).reduceByKey((a,b)=>(a+b)) 
val z=rddHash.cartesian(rddHash) 
val outRdd=z.map(m => (m(0)(0),(m(1)(0),euclidean(m(0)(1).split(','),m(1)(1).split(','))))) 

X die Datenmenge als (String, Object) aufgeladen ist.

Aber dieser Code funktioniert nicht, das Problem ist der Teil in Bezug auf die dritten Zeilen, in denen ich versuche, Elemente über m (0) (0), m (1) (0) usw. zu wählen. Der Fehler ist:

<console>:42: error: ((String, String), (String, String)) does not take parameters 

Wie kann ich jedes Feld in der rdd in Scala wählen?

Ps meine Codezeile in pyspark ist die folgende:

outRdd=cartesian.map(lambda m: (m[0][0],(m[1][0],euclidean(m[0][1].split(','),m[1][1].split(','))))) 

Wo kartesischer die gleiche struucture zeigte, dass vor:

((String, String), (String, String)) 

Antwort

1

Sie können direkt nicht m(index) auf Tupel in scala nennen.

Sie können entweder mithilfe von Zugriffsfeldern _1 oder Pattern-Matching verwenden, die in der Regel besser lesbar ist:

val outRdd = z.map(m => (m._1._1, (m._2._1, ...)) 

Oder:

val outRdd = z.map { case ((hex1, obj1), (hex2, obj2)) => 
    (hex1, (hex2, ...)) 
} 
Verwandte Themen