PySpark:无法计算数组<string>中的字频率

时间:2017-12-01 16:12:19

标签: python arrays pyspark

我在Dataframe中有一系列字符串(称为&#39;字&#39;)。

如果我输入&#39;单词&#39;我得到了PySpark控制台:

DataFrame[words: array<string>]

每个元素都以逗号分隔。 现在,鉴于这个数组,我想以这种方式找出它们的频率:

count = words.flatMap(lambda line: line.split(',')).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)

现在,当我尝试打印我的结果时(使用.first,.collect,.take(n))我有这个错误:

PythonRDD[292] at RDD at PythonRDD.scala:43

是否可以使用逗号分割功能计算单词频率?或者,也许还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

单词列已经是一个数组了,所以你不能拆分它,也许你的意思是这个?

words.show()
#+------------------+
#|             words|
#+------------------+
#|[, ", an, animate]|
#|[, ", battlefield]|
#| [, ", be, gentle]|
#+------------------+

words.rdd.flatMap(lambda a: [(w,1) for w in a.words]).reduceByKey(lambda a,b: a+b).collect()
# [(u'', 3), (u'gentle', 1), (u'battlefield', 1), (u'be', 1), (u'animate', 1), (u'"', 3), (u'an', 1)]

或者更简单的方法在展平单词列后使用countByValue,如果结果符合驱动程序内存:

words.rdd.flatMap(lambda a: a.words).countByValue()
# defaultdict(<type 'int'>, {u'': 3, u'battlefield': 1, u'"': 3, u'be': 1, u'an': 1, u'gentle': 1, u'animate': 1})

答案 1 :(得分:1)

在pyspark中尝试

from pyspark.sql.functions import col, explode
words(explode(col('words')).alias('word'))\
   .groupBy('word').count().orderBy('count',ascending=False).show(100, truncate=False)