我不太确定该如何表达标题。 我有一个带有一列的数据框,其中每一行都包含一个令牌列表。我需要获取单词的频率,然后对其进行排序,以便获得最频繁的单词。这是DataFrame模式的图像:https://i.stack.imgur.com/elkZz.png
使用分词器获取令牌数组。
What the array inside the Dataframe row looks like
现在,当“行”仅由一个包含大量单词的字符串组成,而不是由在每个索引处包含单词的列表组成时,我已经这样做了。
使用:
frequency = dataframe.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
但是,我终生无法设法找到如何访问元素的方法。上面的lambda表达式不起作用,因为它试图在列表上执行。 '无法散列的类型:'列表'
那么tldr中的问题是:如何正确访问数组中的元素以计算数据帧所有行中单词的出现频率?此外,我将如何将结果放入数组?
答案 0 :(得分:1)
一种方法是在explode
模块中使用pyspark.sql.functions
。它接受一个数组列,并为您应用explode
函数的整个列的数组中的每个元素返回一个新行。由于您的DataFrame只有一列,因此要获得整个DataFrame中的单词数,它看起来应该像这样:
dataframe \
.select(explode("words").alias("words_exploded")) \
.groupBy("words_exploded") \
.count()
如果要获取每个记录的字数,可以在“分解”列表之前添加一个ID列,例如通过使用monotonically_increasing_id
:
dataframe \
.withColumn(monotonically_increasing_id().alias('id')) \
.select(explode("words").alias("words_exploded")) \
.groupBy("id", "words_exploded").count()