Pyspark:根据 Array(String) 长度或 CountVectorizer 计数过滤 DF
Pyspark: Filter DF based on Array(String) length, or CountVectorizer count
我已将 URL 数据汇总到一个字符串数组中。属于这种形式。 [xyz.com,abc.com,efg.com]
我最终在 pyspark 中使用计数矢量化器将其转换为类似 (262144,[3,20,83721],[1.0,1.0,1.0]) 的矢量。
矢量表示 262144;对于某一行,存在 3 个索引为 3,20 和 83721 的 Url。所有这些数据都是二进制的,因此是 1 的数组。
我想过滤并仅使用包含一定数量条目的行。因此,如果我说只想使用包含 4 个示例的行;我希望删除上面的行。
我可以对 Count Vectorizer 返回的 Vector 形式的字符串数组进行过滤。
在我的数据中,我有数千万行,但我不确定如何有效地处理。
这是为生成示例而编辑的文档中的代码
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 生成的向量或之前的字符串数组执行此操作,只要它对我的数据大小有效即可。
您可以将 DataFrame.filter 与大小函数一起使用:
from pyspark.sql.functions import size
df.filter(size('words') > 2).show()
+---+---------+
| id| words|
+---+---------+
| 1|[a, b, c]|
+---+---------+
我会在 CountVectorizer 之前执行此操作,以避免让它执行不需要完成的工作。如果 Spark 可以确定这样做是安全的,它将在执行计划中更早地拉取过滤器操作,但明确总是更好。
我已将 URL 数据汇总到一个字符串数组中。属于这种形式。 [xyz.com,abc.com,efg.com]
我最终在 pyspark 中使用计数矢量化器将其转换为类似 (262144,[3,20,83721],[1.0,1.0,1.0]) 的矢量。
矢量表示 262144;对于某一行,存在 3 个索引为 3,20 和 83721 的 Url。所有这些数据都是二进制的,因此是 1 的数组。
我想过滤并仅使用包含一定数量条目的行。因此,如果我说只想使用包含 4 个示例的行;我希望删除上面的行。
我可以对 Count Vectorizer 返回的 Vector 形式的字符串数组进行过滤。
在我的数据中,我有数千万行,但我不确定如何有效地处理。
这是为生成示例而编辑的文档中的代码
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 生成的向量或之前的字符串数组执行此操作,只要它对我的数据大小有效即可。
您可以将 DataFrame.filter 与大小函数一起使用:
from pyspark.sql.functions import size
df.filter(size('words') > 2).show()
+---+---------+
| id| words|
+---+---------+
| 1|[a, b, c]|
+---+---------+
我会在 CountVectorizer 之前执行此操作,以避免让它执行不需要完成的工作。如果 Spark 可以确定这样做是安全的,它将在执行计划中更早地拉取过滤器操作,但明确总是更好。