Python Pyspark-计数向量器向量元素上的大小函数?

Python Pyspark-计数向量器向量元素上的大小函数?,python,apache-spark,pyspark,spark-dataframe,countvectorizer,Python,Apache Spark,Pyspark,Spark Dataframe,Countvectorizer,背景: 我将URL数据聚合到一个字符串数组中。这种形式的。[xyz.com,abc.com,efg.com] 1) 我根据一行中的Url计数进行筛选 vectored_file(size('agg_url_host')>3) 2) 我过滤掉在下一步中不经常出现的URL CountVectorizer(inputCol="agg_url_host",outputCol="vectors",minDF=10000) 问题是,在步骤1中,有些行的大小足够通过my size函数,但在我们删除不

背景: 我将URL数据聚合到一个字符串数组中。这种形式的。[xyz.com,abc.com,efg.com]

1) 我根据一行中的Url计数进行筛选

vectored_file(size('agg_url_host')>3)
2) 我过滤掉在下一步中不经常出现的URL

CountVectorizer(inputCol="agg_url_host",outputCol="vectors",minDF=10000)
问题是,在步骤1中,有些行的大小足够通过my size函数,但在我们删除不太频繁的URL之后,就不能通过了。因此,我以向量列的行作为结束: (68,[],[]) (68,[4,56],[1.0,1.0]) 即使我只想要计数大于3的行进行建模

所以我的问题是,我可以在向量对象上运行一个大小函数,比如countVectorizer的输出吗?或者它们是一个类似的功能,将删除低计数

也许有一种方法可以从我原来的“agg_url”列创建一个新的字符串数组列,并且删除的频率更低?然后我可以对它执行CountVectorizer


感谢您的帮助。

输出向量的大小始终是固定的,因此您唯一能做的就是计算非零元素:

from pyspark.sql.functions import udf

@udf("long")
def num_nonzeros(v):
    return v.numNonzeros()

df = spark.createDataFrame([
    (1, SparseVector(10, [1, 2, 4, 6], [0.1, 0.3, 0.1, 0.1])),
    (2, SparseVector(10, [], []))
], ("id", "vectors"))

df.where(num_nonzeros("vectors") > 3).show()
# +---+--------------------+      
# | id|             vectors|
# +---+--------------------+
# |  1|(10,[1,2,4,6],[0....|
# +---+--------------------+

但像这样的操作通常不是非常有用的特征工程步骤。请记住,缺少信息也是信息。

您可以将密集向量强制转换为字符串,然后拆分和计数。这样你就不需要使用udf了,虽然它不是很干净,但它更有效 代码将如下所示

from pyspark.sql import functions as F
df = df.withColumn('str' ,df['vector'].cast('string'))
df = df.withColumn('count' , (F.size(F.split('str' , ','))-1)/2)

这种方法假设不存在空向量