2016-08-17 19 views
1

私はDataFrameをpysparkするのが初めてです。多分私はこれを正しく理解していないでしょう。RDDに落とさずにpyspark DataFrameをLabeledPointに変換します

は、私がLabeledPointにこれを変換したい場合は、私はマップ機能を使用してRDDにドロップダウンする必要があります。私は、データフレーム

a = sqlContext.createDataFrame([[(2,3,4)],[(1,2,3)]],['things']) 

を持っていることを言います

from pyspark.mllib.regression import LabeledPoint 
def convert(x): 
    z = [float(y) for y in x] 
    return LabeledPoint(z[0], z[1:]) 

rdd = a.map(lambda x: convert(x['things'])) 
rdd.take(2) 
df=rdd.toDF() 

DataFrame selectステートメントと以下のようなUDFを併用できないのはなぜですか?

org.apache.spark.SparkException: Job aborted due to stage failure: Task 6 in stage 33.0 failed 1 times, most recent failure: Lost task 6.0 in stage 33.0 (TID 101, localhost): net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for pyspark.mllib.linalg.DenseVector) 

答えて

0

問題があなたのudfdefinitionである:

from pyspark.sql.functions import udf 
def convert(x): 
    z = [float(y) for y in x] 
    return LabeledPoint(z[0], z[1:]) 

udf_convert = udf(convert) 
df = a.select(udf_convert(a['things'])) 
display(df) 

私はというエラーを取得しています。戻り値はStringType(デフォルト)ではありませんので、指定する必要があります。残念ながら、LabeledPointUDTはありませんので、そのような操作にはudfを使用できません。

LabeledPointは、RDDで主に動作するmllibで使用されます。 DataFrameLabeledPointを作成する理由を教えてください。とにかく後で使用するのは面倒です。あなたは+ mlDataFrameを使用することを選択した場合

、あなたはあなたのudfの機能を助けるために(2.0とml.linalgで、mllib.linalgでスパーク2.0前)VectorUDTがあることを見つけるせていただきます。

+0

ありがとうございます。私はUDFとUDTがどう関係しているかについてはあまりよく分かりません。私は参照のための適切なサイトに私を指すことができますか? – user2773013

+0

[ユーザー定義関数](https://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=udf#pyspark.sql.functions.udf)は、DataFrame列で機能します。現在、pysparkには[User Defined Type](https://spark.apache.org/docs/latest/api/python/_modules/pyspark/sql/types.html)の正式サポートはありません。 – ShuaiYuan

関連する問題