我在Dataframe中有一系列字符串(称为'字')。
如果我输入'单词'我得到了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
是否可以使用逗号分割功能计算单词频率?或者,也许还有其他方法吗?
答案 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)