2015-09-25 11 views
28

Sto provando a caricare un file SVM e convertirlo in un DataFrame così posso utilizzare il modulo ML (Pipeline ML) da Spark. Ho appena installato una nuova Spark 1.5.0 su Ubuntu 14.04 (no spark-env.sh configurato).L'oggetto 'PipelinedRDD' non ha attributo 'toDF' in PySpark

mio my_script.py è:

from pyspark.mllib.util import MLUtils 
from pyspark import SparkContext 

sc = SparkContext("local", "Teste Original") 
data = MLUtils.loadLibSVMFile(sc, "/home/svm_capture").toDF() 

e sto correndo con: ./spark-submit my_script.py

e ottengo l'errore:

Traceback (most recent call last): 
File "/home/fred-spark/spark-1.5.0-bin-hadoop2.6/pipeline_teste_original.py", line 34, in <module> 
data = MLUtils.loadLibSVMFile(sc, "/home/fred-spark/svm_capture").toDF() 
AttributeError: 'PipelinedRDD' object has no attribute 'toDF' 

Quello che non riesco a capire è che se io run:

data = MLUtils.loadLibSVMFile(sc, "/home/svm_capture").toDF() 

direttamente all'interno della shell PySpark, funziona.

risposta

55

toDF metodo è una patch scimmia executed inside SparkSession (SQLContext constructor in 1.x) constructor in modo da essere in grado di usarlo è necessario creare un SQLContext (o SparkSession) prima:

# SQLContext or HiveContext in Spark 1.x 
from pyspark.sql import SparkSession 
from pyspark import SparkContext 

sc = SparkContext() 

rdd = sc.parallelize([("a", 1)]) 
hasattr(rdd, "toDF") 
## False 

spark = SparkSession(sc) 
hasattr(rdd, "toDF") 
## True 

rdd.toDF().show() 
## +---+---+ 
## | _1| _2| 
## +---+---+ 
## | a| 1| 
## +---+---+ 

Per non parlare avete bisogno di un SQLContext per lavorare con DataFrames comunque.