2017-06-20 1 views
0

Die Frage, die ich zuvor gestellt habe, lautet wie folgt. Last questionWie kann ich jede Spalte in einer Tabelle mit DataFrame by Scala vergleichen, ohne sich um die Spalte zu kümmern?

Tabelle 1 - ID-Paaren Tabelle

ID pairs table

Tabelle 2 - Attributtabelle

Attribute table

Tabelle 3

enter image description here

Zum Beispiel haben ID1 und ID2 unterschiedliche Farbe und Größe, so dass die ID1- und ID2-Zeile (2. Zeile in Tabelle 3) "ID1 ID2 0 0" hat;

ID1 und ID3 haben die gleiche Farbe und unterschiedliche Größe, so dass die ID1 und ID3 Zeile (3. Zeile in Tabelle 3) "ID1 ID3 1 0";

gleiches Attribut --- 1 Verschiedene Attribute --- 0

Aber was, wenn ich nicht weiß, wie viele Attributspalten in Tabelle 2; Wie kann ich es schaffen? So wie ich den Spaltennamen Farbe oder Größe nicht kenne. Vielleicht gibt es eine andere Spalte namens Marke. Wie kann ich dann Table3 bekommen?

+0

Also welche Spalten möchten Sie aufnehmen - alle Spalten von "table2", aber die Spalte "id"? –

+0

Sollten Sie Ihre ursprüngliche Frage nicht bearbeiten: https://stackoverflow.com/questions/44582222/how-do-i-compare-each-column-in-a-table-using-dataframe-by-scala/44584928? noredirect = 1 # comment76282713_44584928 –

+0

Tom Lous, danke, dass du mich erinnerst. Ich werde nächstes Mal nachsehen. –

Antwort

1

Die folgende Lösung sollte für jede unbekannte Anzahl von Attributen in Table2 funktionieren. Ich habe die Antwort von Ihrer Last Question

val t1 = List(
    ("id1","id2"), 
    ("id1","id3"), 
    ("id2","id3") 
).toDF("id_x", "id_y") 

val t2 = List(
    ("id1","blue","m","brand1"), 
    ("id2","red","s","brand1"), 
    ("id3","blue","s","brand2") 
).toDF("id", "color", "size", "brand") 

val outSchema = t2.columns.tail 

var t3 = t1 
    .join(t2.as("x"), $"id_x" === $"x.id", "inner") 
    .join(t2.as("y"), $"id_y" === $"y.id", "inner") 

    for(columnName <- outSchema){ 
    t3 = t3.withColumn(columnName+"s", when(col(s"x.$columnName") === col(s"y.$columnName"),1).otherwise(0)) 
     .drop(columnName) 
     .drop("id") 
     .withColumnRenamed(columnName+"s", columnName) 

    } 
t3.show(false) 

Die endgültigen Ausgabe bearbeitet ist

+----+----+-----+----+-----+ 
|id_x|id_y|color|size|brand| 
+----+----+-----+----+-----+ 
|id1 |id2 |0 |0 |1 | 
|id1 |id3 |1 |0 |0 | 
|id2 |id3 |0 |1 |0 | 
+----+----+-----+----+-----+ 

Die Lösung für jede unbekannte Anzahl von Attributen funktionieren soll.

+0

Großartig! Neue Hand wird immer von einem einfachen Problem für lange Zeit gehalten. Vielen Dank! –

+0

Neue Hände sind nicht erfahren genug, aber bald werden sie :). Ich war früher wie du. Danke für die Annahme und das Hochladen. :) –

+0

Hallo, Ramesh. Wie lernst du zuerst scala und funken? Gibt es irgendein gutes Material, das mir empfohlen wird, außer der offiziellen Website? –

Verwandte Themen