2017-06-29 6 views
0

Anfänger hier, ich arbeite mit Spark 2.1.1 und Scala 2.11.8.Wie man eine Spalte von RDD mit anderen Spalten der (a) gleichen (b) verschiedenen RDD abbildet?

Ich habe eine RDD mit sechs Spalten. Dies ist der erste Eintrag der RDD: -

(String, String, String, String, String, String) = (" p69465323_serv80i"," 7 "," fb_406423006398063"," guest_861067032060185_android"," fb_100000829486587"," fb_100007900293502") 

Die tatsächliche RDD hat mehr als 5 Millionen Einträge.

Ich möchte die erste Spalte einzeln mit dem dritten, vierten, fünften und sechsten Spalten in einer solchen Art und Weise abzubilden, dass ich etwas bekommen wie: -

(fb_406423006398063, p69465323_serv80i) 
(guest_861067032060185_android, p69465323_serv80i) 
(fb_100000829486587, p69465323_serv80i) 
(fb_100007900293502, p69465323_serv80i) 

dh die erste Spalte mit dritten individuell zugeordnet ist, vierte, fünfte und sechste Spalte. Wie kann ich dies (a) in der gleichen RDD (b) in verschiedenen RDDs tun? Deklarieren

Antwort

2

Betrachtet man ein Array von Tupeln haben, in dem jedes Element wie ist:

(" p69465323_serv80i"," 7 "," fb_406423006398063"," guest_861067032060185_android"," fb_100000829486587"," fb_100007900293502") 

Sie folgendes verwenden:

val rdd = sc.parallelize(Array((" p69465323_serv80i"," 7 "," fb_406423006398063"," guest_861067032060185_android"," fb_100000829486587"," fb_100007900293502"))) 
val pairedRdd = rdd.map(x => ((x._1, x._3), (x._1, x._4), (x._1, x._5), (x._1, x._6))) 
pairedRdd.collect 
Array[((String, String), (String, String), (String, String), (String, String))] = Array(((" p69465323_serv80i"," fb_406423006398063"),(" p69465323_serv80i"," guest_861067032060185_android"),(" p69465323_serv80i"," fb_100000829486587"),(" p69465323_serv80i"," fb_100007900293502"))) 
+0

Dank !! Aber ich habe hier eine Frage, wird die gleiche Lösung für zwei verschiedene RDDs funktionieren? Dies ist in Bezug auf eine Frage, die ich heute veröffentlicht habe: https://stackoverflow.com/questions/44819655/how-to-perform-set-transformations-on-rdds-with-different-number-of-columns – PixieDev

+0

@AviAggarwal Sie meinen Kartenspalten von einer zur anderen? Nein, das kannst du damit nicht machen. Die Lösung zu dieser Frage sieht gut aus. Wie dort vorgeschlagen, müssen beide RDDs vom selben Typ sein. – philantrovert

0
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder 
import org.apache.spark.sql.Encoder 
import spark.implicits._ 

//val yourRDD = (" p69465323_serv80i"," 7 "," fb_406423006398063"," guest_861067032060185_android"," fb_100000829486587"," fb_100007900293502") 
val newDF = yourRDD 
    .map(_.split(",")) 
    .map(attributes => YourModelClass(attributes(0),attributes(1), 
    attributes(2), attributes(3), attributes(4))) 
    .toDF() 
// Register the DataFrame as a temporary view 
newDF.createOrReplaceTempView("DFTable") 

val firstDF = spark.sql("SELECT secondCol, firstCol FROM DFTable") 
val secondDF = spark.sql("SELECT thirdCol, firstCol FROM DFTable") 
// val thirdDF = .... etc 

YourModelClass Objekt oder eine Klasse mit Variablen: FirstCol, secondCol, ... fiftCol.

Ich hoffe, dass Ihnen helfen

Verwandte Themen