7

나는 ML Pipeline를 만들려고 다음과 같은 오류를 받고 있어요 :PyFark DataFrame에서 ArrayType을 DenseVector로 변환하는 방법은 무엇입니까?

pyspark.sql.utils.IllegalArgumentException: 'requirement failed: Column features must be of type [email protected] but was actually ArrayType(DoubleType,true).' 

features 열은 부동 소수점 값의 배열을 포함하고 있습니다. 어떤 종류의 벡터로 변환해야 할 필요가있는 것 같습니다 (DenseVector는 그렇게 희소하지 않습니다). DataFrame에서 직접이 작업을 수행 할 수있는 방법이 있습니까? 아니면 RDD로 변환해야합니까?

답변

12

당신은 UDF를 사용할 수 있습니다 스파크에서

udf(lambda vs: Vectors.dense(vs), VectorUDT()) 

< 2.0 가져 오기 :

스파크에서
from pyspark.mllib.linalg import Vectors, VectorUDT 

2.0 이상 수입 :

from pyspark.ml.linalg import Vectors, VectorUDT 

이러한 클래스가 호환되지 유의하시기 바랍니다 동일한 구현에도 불구하고.

개별 기능을 추출하고 VectorAssembler으로 어셈블 할 수도 있습니다. 입력 열이 features이라고 가정하면 :

from pyspark.ml.feature import VectorAssembler 

n = ... # Size of features 

assembler = VectorAssembler(
    inputCols=["features[{0}]".format(i) for i in range(n)], 
    outputCol="features_vector") 

assembler.transform(df.select(
    "*", *(df["features"].getItem(i) for i in range(n)) 
))