gpt4 book ai didi

python - PySpark 按给定 SparseVector() 索引处的值过滤

转载 作者:行者123 更新时间:2023-12-05 05:01:15 26 4
gpt4 key购买 nike

我在尝试做一些看似非常简单的事情时遇到了问题。我有以下格式的 DF:

+---------+---------------------+
|id |feat_vctr |
+---------+---------------------+
|XXXXXXXX |(4,[],[]) |
|XXXXXXXX |(4,[0],[5.0]) |
|XXXXXXXX |(4,[2,3],[25.0,15.0])|
+---------+---------------------+

其中 feat_vctrpyspark.ml.linalg.SparseVector

请注意,printSchema() 将其简单地显示为向量,但它采用稀疏向量的格式...

无论如何,我想将其过滤成 4 个 DF,其中每个数据帧都是上述数据的过滤版本,其中在给定索引处没有值的所有行都被过滤掉。

我正在尝试使用:

filtered_df_idx_0 = df.filter(df.feat_vctr[0] > 0.0)
filtered_df_idx_1 = df.filter(df.feat_vctr[1] > 0.0)
filtered_df_idx_2 = df.filter(df.feat_vctr[2] > 0.0)
filtered_df_idx_3 = df.filter(df.feat_vctr[3] > 0.0)

我遇到了一个错误

Py4JJavaError: An error occurred while calling o1089.filter.
: org.apache.spark.sql.AnalysisException: Can't extract value from feat_vctr#1007: need struct type but got struct<type:tinyint,size:int,indices:array<int>,values:array<double>>;

这对我来说很奇怪,因为我可以直接使用以下方法创建稀疏向量:

v = SparseVector(4, {1:2.3, 3:4.0})

v[1]

返回 2.3(在 jupyter notebook 中)

最佳答案

我无法在 filter 函数中执行此操作

它似乎必须使用 UDF 来实现这一点:

# Filter the empty Sparse Vector
def no_empty_vector(value):
if value.indices.size > 0:
return True
else:
return False


no_empty_vector_udf = udf(no_empty_vector, BooleanType())
df = df.filter(no_empty_vector_udf('features'))
df.show()

关于python - PySpark 按给定 SparseVector() 索引处的值过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62781317/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com