DataFrame

时间:2018-12-08 15:38:36

标签: python apache-spark dataframe pyspark

我不太确定该如何表达标题。 我有一个带有一列的数据框,其中每一行都包含一个令牌列表。我需要获取单词的频率,然后对其进行排序,以便获得最频繁的单词。这是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中的问题是:如何正确访问数组中的元素以计算数据帧所有行中单词的出现频率?此外,我将如何将结果放入数组?

1 个答案:

答案 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()
相关问题