web-dev-qa-db-ja.com

「PipelinedRDD」オブジェクトには、PySparkの「toDF」属性がありません

SparkのMLモジュール(DataFrame ML)を使用できるように、SVMファイルをロードしてPipelineに変換しようとしています。 Ubuntu 14.04に新しいSpark 1.5.0をインストールしました(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 Shell内で直接動作します。

42

toDFメソッドはモンキーパッチです SparkSession(1.xではSQLContextコンストラクター)コンストラクター内で実行されます です最初に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|
## +---+---+

言うまでもなく、DataFrameを使用するにはSQLContextが必要です。

88
zero323