我不太确定如何措辞标题。我有一个带有一列的数据框,其中每一行都包含一个标记列表。我需要获取单词的频率,然后对它们进行排序以获得最常用的单词。这是 DataFrame 架构的图像:https ://i.stack.imgur.com/elkZz.png
标记器用于获取标记数组。
现在,当“行”仅包含一个包含大量单词的字符串而不是每个索引处包含单词的列表时,我之前已经这样做了。
和 :
frequency = dataframe.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
但是,我终其一生都无法弄清楚如何访问这些元素。上面的 lambda 表达式不起作用,因为它试图在列表中执行它。'不可散列的类型:'列表''
所以 tldr 中的问题:如何正确访问数组中的元素以计算数据帧所有行中单词的频率?此外,我将如何将结果放入数组中?
一种方法是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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句