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

时间:2017-09-17 21:16:09

标签: apache-spark pyspark

我有一个包含大约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 Keyword列上尝试了groupby - count并加入了原来的key_count df,但这也需要花费大量的时间。计数和重复计算之前在同一数据集上的函数运行一秒或两秒或更少,以及我在生成的df上运行的任何后续函数在我的计算机上使用直接Python比在一个体面大小的集群上运行的PySpark更快。所以,不用说,我正在做的事情绝对不是最佳的......

1 个答案:

答案 0 :(得分:1)

您的窗口函数解决方案将是最有效的,连接意味着2种类型,而窗口仅意味着一种。您可以通过在窗口之前执行groupBy而不是在dropDuplicates之后进行优化:  

import pyspark.sql.functions as psf
from pyspark.sql import Window
w = Window.partitionBy("Clean_Keyword")
key_count  = key_lemma\
    .groupBy(key_lemma.columns)\
    .agg(psf.count("*").alias("Frequency"))\
    .withColumn("Frequency", psf.sum("Frequency").over(w))
key_count.show()

    +-------------+-----------+-------------+---------+
    | Keyword_Type|    Keyword|Clean_Keyword|Frequency|
    +-------------+-----------+-------------+---------+
    |Not Geography|       cave|         cave|        1|
    |Not Geography|        cat|          cat|        4|
    |Not Geography|       cats|          cat|        4|
    |Not Geography|  celebrity|    celebrity|        2|
    |Not Geography|celebrities|    celebrity|        2|
    +-------------+-----------+-------------+---------+

这会更有效,特别是如果你有很多行而不是那么多不同的键(大多数Keywords等于他们的Clean_Keyword