PySpark按给定SparseVector()索引处的值进行筛选

2024-04-18 14:34:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试做一些看起来很简单的事情时遇到了问题。我有以下格式的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笔记本中)


Tags: df格式typefilterarray向量structfiltered
1条回答
网友
1楼 · 发布于 2024-04-18 14:34:20

我无法在filter function中执行此操作

似乎必须使用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()

相关问题 更多 >