pyspark - 使用 spark.ml 库的 N-gram 计数和唯一值
问题描述
我在这里尝试做的是使用此处提供的代码计算 N-gram Stack Overflow Answer for N-gram
以下数据为测试数据,实际计算将基于大型分布式数据
+--------------+
| author|
+--------------+
|Test Data Five|
|Test Data Five|
|Data Test Five|
|Test data Five|
|Test Data Five|
| Jack|
+--------------+
from pyspark.ml.feature import NGram
from pyspark.ml import Pipeline
from pyspark.sql import functions as F
def build_ngrams(name,n=3):
ngrams = [
NGram(n=i, inputCol=name, outputCol="{0}_grams".format(i))
for i in range(1, n + 1)
]
return Pipeline(stages=ngrams)
temp_kdf = author_df.withColumn("author", F.split("author", "\s+"))
temp_kdf = temp_kdf.groupby().agg(F.collect_list('author').alias('author'))
data = temp_kdf.select(F.flatten(temp_kdf.author).alias('author'))
temp_kdf = build_ngrams('author).fit(data).transform(data)
我得到的结果如下
+--------------------+
| 2_grams|
+--------------------+
|[Test Data, Data Five, Five Test, Test Data, Data Five, Five Data, Data Test, Test Five, Five Test, Test data, data Five, Five Test, Test Data, Data Five, Five Jack]|
+--------------------+
我想要的结果是“n_gram”中的前“N”行,它们的频率计数如下
+---------+--------+
| 1_grams|1_counts|
+---------+--------+
|Test Data| 3|
|Data Five| 3|
|Five Test| 3|
|Five Data| 1|
+---------+--------+
解决方案
temp_data
.select(col)
.rdd
.flatMap(lambda doc: [(x, 1) for x in doc[0]])
.reduceByKey(Lambda x, y: x + y)
有人可以提供比这更好的优化解决方案吗
推荐阅读
- python - 如何使用 Python 查询所有 Mailchimp 活动的列表?
- python - 蝗虫忽略扩展子类并实例化基类
- javascript - 部署后 Ajaxcontrolkit 输入按钮不起作用
- ios - 仅调试依赖的 CocoaPod 在 xcodebuild 上失败
- php - Laravel 8.x:SQLSTATE[42000]:运行查询时出现语法错误或访问冲突
- algorithm - 修改 Delaunay 三角剖分的有效方法
- xcode - 在 UiTests 或 UnitTests 中测试 UserDefaults 值
- python - 当我等待“reaction_remove”时,Bot.wait_for() 不能正常工作
- python - 为什么下面的代码没有正确输出对应的字母?
- reactjs - 做出反应。每 N 秒填充一个状态数组,并且仅当它小于 X 长度时