Apache spark 在此数据帧中计算值的最有效方法是什么?

Apache spark 在此数据帧中计算值的最有效方法是什么?,apache-spark,pyspark,Apache Spark,Pyspark,我有一个包含大约20万个单词和短语的数据框。许多短语是重复的(例如,“冒险”一词出现了数千次)。我想对每个单词进行计数,然后进行重复数据消除。我这样做的尝试花费了很长的时间——比整个脚本中的任何其他内容都要长——并且在获得计数后对结果数据帧执行任何操作也需要花费很长的时间 我的初始输入如下所示: Keyword_Type Keyword Clean_Keyword Not Geography cat cat Not Geography cat

我有一个包含大约20万个单词和短语的数据框。许多短语是重复的(例如,“冒险”一词出现了数千次)。我想对每个单词进行计数,然后进行重复数据消除。我这样做的尝试花费了很长的时间——比整个脚本中的任何其他内容都要长——并且在获得计数后对结果数据帧执行任何操作也需要花费很长的时间

我的初始输入如下所示:

Keyword_Type    Keyword     Clean_Keyword
Not Geography   cat         cat
Not Geography   cat         cat
Not Geography   cat         cat
Not Geography   cats        cat
Not Geography   cave        cave
Not Geography   celebrity   celebrity
Not Geography   celebrities celebrity
我正在寻找这样的输出,它统计给定单词在数据帧中出现的所有时间

Keyword_Type    Keyword     Clean_Keyword   Frequency
Not Geography   cat         cat             4 
Not Geography   cat         cat             4
Not Geography   cat         cat             4
Not Geography   cats        cat             4
Not Geography   cave        cave            1
Not Geography   celebrity   celebrity       2
Not Geography   celebrities celebrity       2
我当前使用的代码段如下所示:

w = Window.partitionBy("Clean_Keyword")
key_count = key_lemma.select("Keyword_Type","Keyword", "Clean_Keyword", count("Clean_Keyword").over(w).alias("Frequency")).dropDuplicates()

我还在Clean关键字列上尝试了
groupby
-
count
,并返回到原始的key\u count df,但这也花费了令人厌恶的大量时间。在计数和重复数据消除之前,同一数据集上的函数运行的时间为一秒或两秒或更短,而我在生成的df上运行的任何后续函数在我的计算机上使用的是纯Python,比在相当大的集群上运行的PySpark要快。所以,不用说,我正在做的事情肯定不是最优的…

您的窗口函数解决方案将是最有效的,一个连接意味着两种排序,而一个窗口只意味着一种排序。您可以在窗口打开之前执行
groupBy
,而不是在以下操作之后执行
dropDuplicates
,从而进行优化:

import pyspark.sql.函数作为psf
从pyspark.sql导入窗口
w=窗口.partitionBy(“Clean_关键字”)
key\u count=key\u引理\
.groupBy(键引理列)\
.agg(psf.count(“*”).别名(“频率”))\
.带列(“频率”,psf.总和(“频率”)。超过(w))
键\u count.show()
+-------------+-----------+-------------+---------+
|关键词|类型|关键词|清洁|关键词|频率|
+-------------+-----------+-------------+---------+
|不是地理洞穴洞穴1|
|不是地理问题|
|不是地理,而是猫|
|不是地理、名人、名人2|
|不是地理、名人、名人2|
+-------------+-----------+-------------+---------+

这将更有效,特别是如果您有很多行,但没有那么多不同的键(大多数
关键字
等于它们的
Clean_关键字

您的窗口函数解决方案将是最有效的,一个连接意味着两种排序,而一个窗口只意味着一种排序。您可以在窗口打开之前执行
groupBy
,而不是在以下操作之后执行
dropDuplicates
,从而进行优化:

import pyspark.sql.函数作为psf
从pyspark.sql导入窗口
w=窗口.partitionBy(“Clean_关键字”)
key\u count=key\u引理\
.groupBy(键引理列)\
.agg(psf.count(“*”).别名(“频率”))\
.带列(“频率”,psf.总和(“频率”)。超过(w))
键\u count.show()
+-------------+-----------+-------------+---------+
|关键词|类型|关键词|清洁|关键词|频率|
+-------------+-----------+-------------+---------+
|不是地理洞穴洞穴1|
|不是地理问题|
|不是地理,而是猫|
|不是地理、名人、名人2|
|不是地理、名人、名人2|
+-------------+-----------+-------------+---------+

这将更有效,特别是如果你有很多行,但没有那么多不同的键(大多数
关键字
等于它们的
Clean_关键字

我不明白这些频率数字是如何产生的。文本在哪里?在关键字列中?我通过分区函数创建了它们。这里的数据集没有排序,但冒险可能会在我的数据集中出现数千次。我打开了关键字窗口并计算了其中的行数。窗口是基于关键字和计数中的行创建的。希望这能回答你的问题——不确定这是否是困惑的根源!除非我遗漏了什么,否则您不需要在
groupby
count
之后加入。按所有三列分组,而不仅仅是
Clean_关键字
。您是否尝试从数据帧中的任何位置进行计数?案例重要吗?你能举个小的例子吗?只是更新了一个更好的例子。我不认为所有3列都可以分组,因为我对clean_关键字值的数量特别感兴趣。我还需要保留其他两列,以备以后使用。我不明白这些频率数字是如何产生的。文本在哪里?在关键字列中?我通过分区函数创建了它们。这里的数据集没有排序,但冒险可能会在我的数据集中出现数千次。我打开了关键字窗口并计算了其中的行数。窗口是基于关键字和计数中的行创建的。希望这能回答你的问题——不确定这是否是困惑的根源!除非我遗漏了什么,否则您不需要在
groupby
count
之后加入。按所有三列分组,而不仅仅是
Clean_关键字
。您是否尝试从数据帧中的任何位置进行计数?案例重要吗?你能举个小的例子吗?只是更新了一个更好的例子。我不认为所有3列都可以分组,因为我对clean_关键字值的数量特别感兴趣。我还需要把另外两个专栏留到以后。谢谢!不幸的是,这种方法需要更长的时间:(我在10分钟后将其杀死;我使用的方法需要3-4分钟。效率是通过groupby获得的吗?(不是以指责的方式问这个问题,只是好奇。)这将取决于您的数据,但如果您有大量的
关键字
等于那里的
Clean_关键字
gr