Объект PipelinedRDD не имеет атрибута 'toDF' в PySpark
Я пытаюсь загрузить SVM файл и преобразовать его в DataFrame
, чтобы я мог использовать модуль ML (Pipeline
ML) от Spark.
Я только что установил свежий Spark 1.5.0 на Ubuntu 14.04 (без spark-env.sh
).
Мой 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()
и я использую: ./spark-submit my_script.py
И я получаю сообщение об ошибке:
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'
Я не могу понять, что если я запустил:
data = MLUtils.loadLibSVMFile(sc, "/home/svm_capture").toDF()
непосредственно внутри оболочки PySpark, она работает.
Ответы
Ответ 1
toDF
метод - это патч обезьяны выполнен внутри конструктора SparkSession
(SQLContext
конструктор в 1.x), чтобы иметь возможность для его использования сначала необходимо создать SQLContext
(или SparkSession
):
# 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|
## +---+---+
Не говоря уже о необходимости использовать SQLContext
для работы с DataFrames.