2015-09-14 57 views
7

python中的什麼.map()函數用於從spark數據框創建一組標記點?如果標籤/結果不是第一列,但我可以參考它的列名'status',那麼符號是什麼?在Python中使用Spark DataFrame創建標記點

我創建了蟒蛇數據框與此.MAP()函數:

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 

我把它轉換成數據框火花的減少功能之後重組所有的大熊貓dataframes。

parsedData=sqlContext.createDataFrame(parsedData) 

但現在如何在python中創建labledPoints?我認爲它可能是另一個.map()函數?

回答

11

如果你已經有數值的功能和其不需要額外的轉換,你可以使用VectorAssembler含獨立變量列組合:

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))) 

火花的2.0 mlmllib API不再兼容,後者將會被棄用和刪除。如果你仍然需要這個,你必須將ml.Vectors轉換爲mllib.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()'不適用於數據框。其次,即使首先轉換爲RDD,它也會產生錯誤「TypeError:無法將類型轉換爲Vector'。 – xenocyon

相關問題