2017-04-06 2 views
0

Ich habe einen Funken (Python) Datenrahmen mit zwei Spalten: ein Benutzer-ID und dann einem Array von Arrays, die in einem umhüllten Funken als Array wie so dargestellt wird:Pyspark 2.1.0 gewickelte Array zu Array

[WrappedArray(9, 10, 11, 12), WrappedArray(20, 21, 22, 23, 24, 25, 26)] 

in seiner üblichen Darstellung würde dies wie folgt aussehen:

[[9, 10, 11, 12], [20, 21, 22, 23, 24, 25, 26]] 

ich möchte Operationen auf jedem der Sub-Arrays durchzuführen, zum Beispiel eine dritte Liste nehmen und prüfen, ob eine ihrer Werte in der ersten Untergruppe ist , aber ich finde keine Lösungen für pyspark 2.0 (nur Scala-spezifische ältere Lösungen wie this und this).

Wie kann man auf eingepackte Arrays zugreifen (und im Allgemeinen mit ihnen arbeiten)? Was ist ein effizienter Weg, um das zu tun, was ich oben beschrieben habe?

Antwort

1

Sie können jedes umgebrochene Array als einzelne Liste behandeln. in Ihrem Beispiel, wenn Sie 2 gewickelt Array vorhanden, die Elemente aus in der ersten Reihe ist, Sie so etwas wie tun könnte -

# Prepare data 
data = [[10001,[9, 10, 11, 12],[20, 10, 9, 23, 24, 25, 26]], 
     [10002,[8, 1, 2, 3],[49, 3, 6, 5, 6]], 
     ] 
rdd = sc.parallelize(data) 

df = rdd.map( 
     lambda row : row+[ 
          [x for x in row[2] if x in row[1]] 
         ] 
      ).toDF(["userID","array1","array2","commonElements"]) 

df.show() 

Ausgang:

+------+---------------+--------------------+--------------+ 
|userID|   array1|    array2|commonElements| 
+------+---------------+--------------------+--------------+ 
| 10001|[9, 10, 11, 12]|[20, 10, 9, 23, 2...|  [10, 9]| 
| 10002| [8, 1, 2, 3]| [49, 3, 6, 5, 6]|   [3]| 
+------+---------------+--------------------+--------------+ 
+0

Dank, was eine Lösung wäre mit Datenrahmen anstelle von RDDs? – xv70

+1

vielleicht etwas wie '.getItem (num)', die Sie das Element aus der Liste erhält, wenn Spalte Liste ist. – Pushkr