2015-09-14 11 views
7

Python'da .map() işlevi, bir kıvılcım veri çerçevesinden etiketli bir dizi oluşturmak için kullanıyorum? Eğer etiket/sonuç ilk sütun değilse ancak onun sütun ismine 'durum' diyebiliyorsa notasyon nedir?Python'da Spark DataFrame'den etiketliPoints oluştur

Bu .map() fonksiyonu ile piton dataframe oluşturun:

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 

Ben tüm pandalar dataframes yeniden bağlanmış azaltmak işlevi sonra kıvılcım dataframe dönüştürmek.

parsedData=sqlContext.createDataFrame(parsedData) 

Fakat şimdi python'da bundan nasıl etiketli notlar oluşturabilirim? Başka bir .map() işlevi olabileceğini varsayalım?

from pyspark.ml.feature import VectorAssembler 

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

transformed = assembler.transform(parsedData) 

Sonraki basitçe eşleyebilirsiniz: Spark itibariyle

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

Zaten sayısal özelliklere sahip ve hiçbir ek dönüşümler gerektiren Eğer

cevap

11

sütunları bağımsız değişkenleri içeren birleştirmek VectorAssembler kullanabilirsiniz 2.0 ml ve mllib API artık uyumlu değildir ve ikincisi kullanımdan kaldırmaya ve kaldırmaya doğru gidiyor. Hala buna ihtiyacınız varsa ml.Vectors'u mllib.Vectors'a dönüştürmeniz gerekir.

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

ve harita:

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

Bu maalesef çalışmıyor. İlk olarak, .map() 'dataframes ile çalışmaz. İkincisi, ilk önce bir RDD'ye dönüşse bile, 'TypeError: ' 'vektörüne' 'dönüştürülemiyor. – xenocyon