背景: 我将URL数据聚合到一个字符串数组中。这种形式。 [xyz.com,abc.com,efg.com]
1)我使用
连续根据Url计数进行过滤vectored_file(size('agg_url_host')>3)
2)我使用
过滤掉下一步不经常出现的网址CountVectorizer(inputCol="agg_url_host",outputCol="vectors",minDF=10000)
问题是某些行足以在步骤1中传递我的大小函数,但是在我们删除不太频繁的URL之后没有。所以我最终得到了矢量列读数的行: (68,[],[]) (68,[4,56],[1.0,1.0]) 即使我只想要计数大于3的行。
所以我的问题是我可以在vectorVectorizer的输出上运行矢量对象的大小函数吗?或者他们是一个类似的功能,将删除低计数?
也许有一种方法可以从我原来的'agg_url'列创建一个新的字符串数组列,删除频率较低?然后我可以执行CountVectorizer。
任何帮助表示感谢。
答案 0 :(得分:0)
输出向量的大小总是固定的,所以你唯一能做的就是计算非零元素:
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....|
# +---+--------------------+
但是这样的操作操作一般不是非常有用的特征工程步骤。请记住,缺乏信息也是信息。
答案 1 :(得分:0)
您可以将Dense向量转换为字符串,然后进行分割和计数。这样,您不需要使用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)