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.
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.