2015-09-14 14 views
7

pythonの.map()関数を使用して、sparkデータフレームからlabeledPointsのセットを作成しますか?ラベル/結果が最初の列ではないが、その列名、「ステータス」を参照できる場合は、表記法とは何ですか?PythonのSpark DataFrameからlabeledPointsを作成

私はこの.MAP()関数でPythonのデータフレームを作成します。

def parsePoint(line): 
    listmp = list(line.split('\t')) 
    dataframe = pd.DataFrame(pd.get_dummies(listmp[1:]).sum()).transpose() 
    dataframe.insert(0, 'status', dataframe['accepted']) 
    if 'NULL' in dataframe.columns: 
     dataframe = dataframe.drop('NULL', axis=1) 
    if '' in dataframe.columns: 
     dataframe = dataframe.drop('', axis=1) 
    if 'rejected' in dataframe.columns: 
     dataframe = dataframe.drop('rejected', axis=1) 
    if 'accepted' in dataframe.columns: 
     dataframe = dataframe.drop('accepted', axis=1) 
    return dataframe 

私はそれがすべてのパンダのデータフレームを再結合したreduce関数の後にスパークデータフレームに変換します。

parsedData=sqlContext.createDataFrame(parsedData) 

しかし、これからどのようにしてlabonedPointsをPythonで作成できますか?私は別の.map()関数かもしれないと仮定?

from pyspark.ml.feature import VectorAssembler 

assembler = VectorAssembler(
    inputCols=["your", "independent", "variables"], 
    outputCol="features") 

transformed = assembler.transform(parsedData) 

次はあなたが簡単にマップすることができます:スパークのよう

from pyspark.mllib.regression import LabeledPoint 
from pyspark.sql.functions import col 

(transformed.select(col("outcome_column").alias("label"), col("features")) 
    .rdd 
    .map(lambda row: LabeledPoint(row.label, row.features))) 

すでに数値の機能を持っており、追加の変換を必要としないいる場合は

答えて

11

あなたは列が独立変数を含む結合するVectorAssemblerを使用することができます2.0 mlおよびmllib APIはもはや互換性がなく、後者は非推奨と削除に向かっています。これがまだ必要な場合はml.Vectorsmllib.Vectorsに変換する必要があります。

from pyspark.mllib import linalg as mllib_linalg 
from pyspark.ml import linalg as ml_linalg 

def as_old(v): 
    if isinstance(v, ml_linalg.SparseVector): 
     return mllib_linalg.SparseVector(v.size, v.indices, v.values) 
    if isinstance(v, ml_linalg.DenseVector): 
     return mllib_linalg.DenseVector(v.values) 
    raise ValueError("Unsupported type {0}".format(type(v))) 

とマップ:

lambda row: LabeledPoint(row.label, as_old(row.features))) 
+1

これは、残念ながら、動作しません。まず、 '.map()'はデータフレームでは動作しません。第2に、最初にRDDに変換しても、エラー 'TypeError:タイプをVectorに変換できません。 – xenocyon

関連する問題