python - PySpark 在 Dataframe 列中插入常量 SparseVector

标签 python apache-spark pyspark apache-spark-sql apache-spark-ml

我希望插入我的数据框 tfIdfFr名为 "ref" 的列具有类型为 pyspark.ml.linalg.SparseVector 的常量.

当我尝试这个时

ref = tfidfTest.select("features").collect()[0].features # the reference
tfIdfFr.withColumn("ref", ref).select("ref", "features").show()

我收到此错误 AssertionError: col should be Column

当我尝试这个时:

from pyspark.sql.functions import lit
tfIdfFr.withColumn("ref", lit(ref)).select("ref", "features").show()

我收到错误 AttributeError: 'SparseVector' object has no attribute '_get_object_id'

您知道在 Dataframe 列中插入常量 SparseVector 的解决方案吗?*

最佳答案

在这种情况下,我会跳过收集:

ref = tfidfTest.select(col("features").alias("ref")).limit(1)
tfIdfFr.crossJoin(ref)

一般来说,您可以使用udf:

from pyspark.ml.linalg import DenseVector, SparseVector, Vector, Vectors, \
 VectorUDT 
from pyspark.sql.functions import udf

def vector_lit(v): 
    assert isinstance(v, Vector) 
    return udf(lambda: v, VectorUDT())() 

用法:

spark.range(1).select(
  vector_lit(Vectors.sparse(5, [1, 3], [-1, 1])
).alias("ref")).show()
+--------------------+
|                 ref|
+--------------------+
|(5,[1,3],[-1.0,1.0])|
+--------------------+
spark.range(1).select(vector_lit(Vectors.dense([1, 2, 3])).alias("ref")).show() 
+-------------+
|          ref|
+-------------+
|[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(
    as_column(Vectors.sparse(5, [1, 3], [-1, 1])
 ).alias("ref")).show()  
+--------------------+
|                 ref|
+--------------------+
|(5,[1,3],[-1.0,1.0])|
+--------------------+
spark.range(1).select(as_column(Vectors.dense([1, 2, 3])).alias("ref")).show()
+-------------+
|          ref|
+-------------+
|[1.0,2.0,3.0]|
+-------------+

关于python - PySpark 在 Dataframe 列中插入常量 SparseVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196845/

相关文章:

python-3.x - 如何在pyspark函数中使用全局变量

python - PySpark — UnicodeEncodeError : 'ascii' codec can't encode character

python - 如何在 pyqt5 网络浏览器中为 YouTube 视频创建全屏模式

python - 在 Anaconda Python 中找不到测试模块

python - 将 python 函数上传到 aws lambda

scala - Spark : sum over list containing None and Some()?

Python:让数据对插件可用的方法有哪些?

apache-spark - 阅读最新的 spark kafka 流媒体

java - Spark Dataframe Write to CSV 在 Standalone Cluster Mode 下创建_temporary 目录文件

pyspark - 将列表列拆分为同一 PySpark 数据框中的多列