web-dev-qa-db-fra.com

L'objet 'PipelinedRDD' n'a pas d'attribut 'toDF' dans PySpark

J'essaie de charger un fichier SVM et de le convertir en un fichier DataFrame afin de pouvoir utiliser le module ML (Pipeline ML) de Spark. Je viens d'installer une nouvelle version Spark 1.5.0 sur Ubuntu 14.04 (no spark-env.sh configuré).

Ma my_script.py est:

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

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

et je cours en utilisant: ./spark-submit my_script.py

Et je reçois l'erreur:

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'

Ce que je ne peux pas comprendre, c'est que si je cours:

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

directement dans PySpark Shell, cela fonctionne.

42
Frederico Oliveira

La méthode toDF est un patch de singe exécutée à l'intérieur du constructeur SparkSession (constructeur SQLContext dans 1.x) pour pouvoir l'utiliser, vous devez créez un SQLContext (ou SparkSession) d'abord:

# 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|
## +---+---+

Sans compter que vous avez de toute façon besoin d'un SQLContext pour travailler avec DataFrames.

88
zero323