1. ホーム
  2. python

[解決済み] PipelinedRDD」オブジェクトにPySparkの「toDF」属性がない

2022-02-25 03:02:06

質問

SVMファイルを読み込んで、それを DataFrame ということで、MLモジュール( Pipeline ML)をSparkから取得しました。 Ubuntu 14.04にSpark 1.5.0をインストールしたところです(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のシェルで実行すると、動作します。

どのように解決するのですか?

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 または SparkSession で動作させることができます。 DataFrames をそもそも