Pyspark:根据Array(String)长度或CountVectorizer计数过滤DF

时间:2018-04-06 17:24:21

标签: python apache-spark pyspark spark-dataframe apache-spark-ml

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

我最终在pyspark中使用了一个计数矢量化器来将它变成一个像(262144,[3,20,83721],[1.0,1.0,1.0])这样的矢量。

向量在262144之外的地方;有3个网址的索引为3,20,而83721为某一行。所有这些数据都是二进制的,因此是1的数组。

我想过滤并仅使用包含一定数量条目的行。所以,如果我说只想使用4个例子的行;我希望删除上面的行。

我很好地对Count Vectorizer返回的Vector表单的String数组进行过滤。

在我的数据中,我有数千万行,我只是不确定如何有效地做到这一点。

以下是编辑的文档中的代码,用于生成示例

from pyspark.ml.feature import CountVectorizer

# Input data: Each row is a bag of words with a ID.
df = spark.createDataFrame([
    (0, "a".split(" ")),
    (1, "a b c".split(" "))
], ["id", "words"])

# fit a CountVectorizerModel from the corpus.
cv = CountVectorizer(inputCol="words", outputCol="features",         vocabSize=3)

model = cv.fit(df)

result = model.transform(df)

所以这里说我们只想要2长或更长的结果。同样,我不介意在此之前对CountVectorizer或String数组生成的向量执行此操作,只要它对我的数据大小有效。

1 个答案:

答案 0 :(得分:3)

您可以将DataFrame.filter与size函数一起使用:

from pyspark.sql.functions import size

df.filter(size('words') > 2).show()

+---+---------+
| id|    words|
+---+---------+
|  1|[a, b, c]|
+---+---------+

我会在CountVectorizer之前做到这一点,以避免让它完成不需要做的工作。如果可以确定执行计划是安全的,Spark会在执行计划的早期提取过滤操作,但显式更好。