2015-09-23 7 views

risposta

52

SparkSession.createDataFrame, che viene utilizzato sotto il cofano, richiede un RDD/list di /tuple/list/dict * o pandas.DataFrame, a meno che non sia fornito lo schema con DataType. Provare qualcosa di simile:

myFloatRdd.map(lambda x: (x,)).toDF() 

o meglio ancora:

from pyspark.sql import Row 

row = Row("val") # Or some other column name 
myFloatRdd.map(row).toDF() 

Per creare una DataFrame da un elenco di scalari dovrete usare SparkSession.createDataFrame direttamente e fornire uno schema ***:

from pyspark.sql.types import FloatType 

df = spark.createDataFrame([1.0, 2.0, 3.0], FloatType()) 

df.show() 

## +-----+ 
## |value| 
## +-----+ 
## | 1.0| 
## | 2.0| 
## | 3.0| 
## +-----+ 

ma per una gamma semplice sarebbe meglio usare SparkSession.range:

from pyspark.sql.functions import col 

spark.range(1, 4).select(col("id").cast("double")) 

* Non più supportato.

** Spark SQL fornisce anche un supporto limitato per l'inferenza dello schema su oggetti Python che espongono __dict__.

*** Supportato solo in Spark 2.0 o versioni successive.

+0

Sono un novizio da accendere. puoi spiegare come funziona 'myFloatRdd.map (lambda x: (x,)). toDF()' risolvere questo problema? La 'map (lambda x: (x,))' converte semplicemente l'oggetto RDD in un elenco di righe? – kasa

+0

@kasa C'è una mappatura di inferenza per 'tuples' (->' struct'), non esiste per gli scalari. – zero323