2015-09-14 29 views
7

Chức năng .map() nào trong python để tôi sử dụng để tạo tập hợp các nhãn được gắn nhãn từ một khung dữ liệu tia lửa? Ký hiệu là gì Nếu nhãn/kết quả không phải là cột đầu tiên nhưng tôi có thể tham chiếu đến tên cột của nó, 'trạng thái'?Tạo nhãnPointPoint từ Spark DataFrame bằng Python

tôi tạo dataframe python với chức năng .map() này:

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 

tôi chuyển nó sang một dataframe tia lửa sau khi giảm chức năng đã kết hợp lại tất cả các dataframes gấu trúc.

parsedData=sqlContext.createDataFrame(parsedData) 

Nhưng bây giờ làm cách nào để tạo labedPoints từ mã này trong python? Tôi giả sử nó có thể là một .map() chức năng?

Trả lời

11

Nếu bạn đã có tính năng tính toán và đòi hỏi không có biến đổi bổ sung mà bạn có thể sử dụng VectorAssembler để kết hợp các cột chứa biến độc lập:

from pyspark.ml.feature import VectorAssembler 

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

transformed = assembler.transform(parsedData) 

Tiếp theo bạn chỉ có thể lập bản đồ:

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

Tính đến Spark 2.0 mlmllib API không còn tương thích nữa và API thứ hai sẽ hướng tới việc ngừng sử dụng và xóa. Nếu bạn vẫn cần điều này, bạn sẽ phải chuyển đổi ml.Vectors thành 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))) 

và bản đồ:

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

này không hoạt động, không may. Thứ nhất, '.map()' không hoạt động với các khung dữ liệu. Thứ hai, ngay cả khi người ta chuyển đổi sang RDD trước, nó tạo ra lỗi 'TypeError: Không thể chuyển đổi kiểu thành Vector'. – xenocyon

Các vấn đề liên quan