[英]How to convert ArrayType to DenseVector in PySpark DataFrame?
我在嘗試構建ML Pipeline
遇到以下錯誤:
pyspark.sql.utils.IllegalArgumentException: 'requirement failed: Column features must be of type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 but was actually ArrayType(DoubleType,true).'
我的features
列包含一個浮點值數組。 聽起來我需要將它們轉換為某種類型的向量(它不是稀疏的,所以是DenseVector?)。 有沒有辦法直接在DataFrame上執行此操作,還是需要轉換為RDD?
您可以使用UDF:
udf(lambda vs: Vectors.dense(vs), VectorUDT())
在Spark <2.0導入中:
from pyspark.mllib.linalg import Vectors, VectorUDT
在Spark 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))
))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.