代码杂谈 之 pyspark如何做相似度计算

在 PySpark 中,计算 DataFrame 两列向量的差可以通过使用 UDF(用户自定义函数)和 Vector 类型完成。这里有一个示例,展示了如何使用 PySpark 的

  • pyspark.ml.linalg.Vectors
  • pyspark.sql.functions.udf

来实现这一功能:

首先,确保你已经安装了 PySpark 并且正确设置了 SparkSession。接下来,你可以按照以下步骤操作:

  1. 导入必要的模块。
  2. 创建一个简单的 DataFrame 示例,其中包含两列向量。
  3. 定义一个计算向量差的函数。
  4. 将此函数转换为 UDF。
  5. 使用 UDF 在 DataFrame 上添加一列来存储向量差。
python 复制代码
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, FloatType
from pyspark.ml.linalg import Vectors

# 创建 SparkSession
spark = SparkSession.builder \
    .appName("Vector Difference in PySpark") \
    .getOrCreate()

# 创建示例 DataFrame
data = [(Vectors.dense([1.0, 2.0]), Vectors.dense([4.0, 6.0])),
        (Vectors.dense([2.0, 3.0]), Vectors.dense([5.0, 7.0]))]
df = spark.createDataFrame(data, ["vectorA", "vectorB"])

# 定义计算向量差的函数(余弦距离/欧几里得距离)
def cos_sim(a,b):
    return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

def euclidean_distance(v1, v2):
    return float(np.linalg.norm(np.array(v1) - np.array(v2)))

cos_sim_udf = F.udf(cos_sim,FloatType())

# 在 DataFrame 上使用 UDF 添加新列
tmp_df = tmp_df.withColumn("cos_sim", cos_sim_udf('vectorA','vectorB'))
# 打印结果
df.show()
相关推荐
XiYang-DING15 分钟前
【Java SE】数据类型、变量、类型转换、运算符以及程序逻辑控制
java·开发语言
0思必得01 小时前
[Web自动化] 处理爬虫异常
运维·爬虫·python·selenium·自动化·web自动化
独自破碎E1 小时前
JDK版本的区别
java·开发语言
喵手1 小时前
Python爬虫零基础入门【第九章:实战项目教学·第17节】内容指纹去重:URL 变体/重复正文的识别!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·内容指纹去重·url变体
谦宸、墨白1 小时前
从零开始学C++:二叉树进阶
开发语言·数据结构·c++
喵手1 小时前
Python爬虫零基础入门【第五章:数据保存与入库·第1节】先学最通用:CSV/JSONL 保存(可复现、可分享)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·数据保存与入库·csv/jsonl
建群新人小猿1 小时前
陀螺匠企业助手—个人简历
android·大数据·开发语言·前端·数据库
子夜江寒1 小时前
OpenCV 学习:图像拼接与答题卡识别的实现
python·opencv·学习·计算机视觉
bjxiaxueliang1 小时前
一文掌握Python Flask:HTTP微服务开发从入门到部署
python·http·flask
千金裘换酒2 小时前
栈和队列定义及常用语法 LeetCode
java·开发语言