Python PySpark在数据帧列中插入一个常量SparseVector

Python PySpark在数据帧列中插入一个常量SparseVector,python,apache-spark,pyspark,apache-spark-sql,apache-spark-ml,Python,Apache Spark,Pyspark,Apache Spark Sql,Apache Spark Ml,我希望在我的数据帧tfIdfFr中插入一个名为ref的列,该列带有一个类型为pyspark.ml.linalg.SparseVector的常量 当我尝试这个的时候 ref=tfidfTest.selectfeatures.collect[0]。为引用添加功能 tfIdfFr.withColumnref、ref.selectref、features.show 我得到这个错误断言error:col应该是列 当我尝试这个: 从pyspark.sql.functions导入 tfIdfFr.withCo

我希望在我的数据帧tfIdfFr中插入一个名为ref的列,该列带有一个类型为pyspark.ml.linalg.SparseVector的常量

当我尝试这个的时候

ref=tfidfTest.selectfeatures.collect[0]。为引用添加功能 tfIdfFr.withColumnref、ref.selectref、features.show 我得到这个错误断言error:col应该是列

当我尝试这个:

从pyspark.sql.functions导入 tfIdfFr.withColumnref、litref.selectref、features.show 我得到一个错误AttributeError:'SparseVector'对象没有属性'\u get\u object\u id'


您知道在数据帧列中插入常数SparseVector的解决方案吗?*

在这种情况下,您可以跳过collect:

ref = tfidfTest.select(col("features").alias("ref")).limit(1)
tfIdfFr.crossJoin(ref)
通常,您可以使用udf:

用法:

spark.range(1).select(
  vector_lit(Vectors.sparse(5, [1, 3], [-1, 1])
).alias("ref")).show()
spark.range(1).select(
    as_column(Vectors.sparse(5, [1, 3], [-1, 1])
 ).alias("ref")).show()  
+----------+ |参考号| +----------+ |5,[1,3],[-1.0,1.0]| +----------+ spark.range1.selectvector\u litVectors.dense[1,2,3].aliasref.show +-------+ |参考号| +-------+ |[1.0,2.0,3.0]| +-------+ 也可以使用中间表示法:

import json
from pyspark.sql.functions import from_json, lit
from pyspark.sql.types import StructType, StructField

def as_column(v):
    assert isinstance(v, Vector) 
    if isinstance(v, DenseVector):
        j = lit(json.dumps({"v": {
          "type": 1,
          "values": v.values.tolist()
        }}))
    else:
        j = lit(json.dumps({"v": {
          "type": 0,
          "size": v.size,
          "indices": v.indices.tolist(),
          "values": v.values.tolist()
        }}))
    return from_json(j, StructType([StructField("v", VectorUDT())]))["v"]
用法:

spark.range(1).select(
  vector_lit(Vectors.sparse(5, [1, 3], [-1, 1])
).alias("ref")).show()
spark.range(1).select(
    as_column(Vectors.sparse(5, [1, 3], [-1, 1])
 ).alias("ref")).show()  
+----------+ |参考号| +----------+ |5,[1,3],[-1.0,1.0]| +----------+ spark.range1.selectas\u columnVectors.dense[1,2,3].aliasref.show +-------+ |参考号| +-------+ |[1.0,2.0,3.0]| +-------+