pyspark按给定sparsevector()索引处的值筛选

oug3syen  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(384)

我在尝试做一些看起来很简单的事情时遇到了问题。我有一个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,其中每个Dataframe都是上面的过滤版本,所有在给定索引处没有值的行都被过滤掉。
我试着用:

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笔记本中)

xu3bshqb

xu3bshqb1#

我没能在车里做到这一点 filter function 似乎必须使用自定义项来实现这一点:


# 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()

相关问题