2016-02-19 11 views
7

Vorrei eseguire un'azione su una singola colonna. Sfortunatamente, dopo aver trasformato quella colonna, ora non fa più parte del dataframe da cui proviene, ma un oggetto Colonna. In quanto tale, non può essere raccolto.Come posso raccogliere una singola colonna in Spark?

Ecco un esempio:

df = sqlContext.createDataFrame([Row(array=[1,2,3])]) 
df['array'].collect() 

Questo produce il seguente errore:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'Column' object is not callable 

Come posso utilizzare la funzione collect() su una sola colonna?

risposta

11

Basta selezionare e flatMap:

df.select("array").flatMap(lambda x: x).collect() 
## [[1, 2, 3]] 

Modifica 23/1/2017

Partendo da Spark 2.0.0 è necessario specificare esplicitamente .rdd al fine di utilizzare flatMap

df.select("array").rdd.flatMap(lambda x: x).collect() 
+0

quindi utilizzando seleziona invece di subsetting essenzialmente trasforma questo in un frame di dati di una colonna invece di una colonna – Michal

+0

Questo è giusto. 'Column' è solo un'espressione SQL DSL e non una struttura di dati autonoma. – zero323

+1

Qual è l'equivalente in spark 2.0? Non riesco a vedere flatMap come metodo su DataFrame – ThatDataGuy