将向量列添加到pyspark DataFrame

Bru*_*uno 1 dataframe apache-spark pyspark apache-spark-ml

如何将Vectors.dense列添加到pyspark数据框?

import pandas as pd
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.ml.linalg import DenseVector

py_df = pd.DataFrame.from_dict({"time": [59., 115., 156., 421.], "event": [1, 1, 1, 0]})

sc = SparkContext(master="local")
sqlCtx = SQLContext(sc)
sdf = sqlCtx.createDataFrame(py_df)
sdf.withColumn("features", DenseVector(1))
Run Code Online (Sandbox Code Playgroud)

在文件anaconda3/lib/python3.6/site-packages/pyspark/sql/dataframe.py第1848行中给出错误:

AssertionError: col should be Column
Run Code Online (Sandbox Code Playgroud)

它不喜欢将DenseVector类型作为列。本质上,我有一个pandas数据框,我想将其转换为pyspark数据框并添加type的列Vectors.dense。还有另一种方法吗?

hi-*_*zir 6

常量Vectors不能作为文字添加。您必须使用udf

from pyspark.sql.functions import udf
from pyspark.ml.linalg import VectorUDT

one = udf(lambda: DenseVector([1]), VectorUDT())
sdf.withColumn("features", one()).show()
Run Code Online (Sandbox Code Playgroud)

但是我不确定为什么您需要它。如果您想将现有的列转换为Vectors使用适当的pyspark.ml工具,例如VectorAssembler- 在PySpark中编码和组合多个功能

from pyspark.ml.feature import VectorAssembler

VectorAssembler(inputCols=["time"], outputCol="features").transform(sdf)
Run Code Online (Sandbox Code Playgroud)