因此,我当前的代码看起来沿着
val tokens =
.read.option("wholetext", true).textFile(path)
.flatMap(line => line.split(" ")
.withColumn("filename", substring_index(input_file_name, "/", -1))
.groupBy(col("value"))
.agg(collect_list("filename") as "docs")
它读取path
中的所有文本文档,并创建一个类似于以下内容的Dataframe:
|word1 |[1.txt] |
|word2 |[2.txt] |
|word3 |[2.txt, 1.txt, 1.txt] |
现在我想把这些列表简化成这样(对不起,我实际上不知道Scala中的map是什么样子的)
|word1 |[(1.txt, 1)] |
|word2 |[(2.txt, 1)] |
|word3 |[(1.txt, 2), (2.txt, 1)] |
理论上我知道该怎么做:取列表条目,将它们Map到(entry,1),然后通过将计数相加来减少它们。但我对Scala的经验很少,所以我不知道如何将其写入代码。
如上所述,我想让文档名称成为Map中的键,以使访问计数更容易。
1条答案
按热度按时间but5z9lq1#
这应该可以了,得到一个Array,你可以转换成Map。这里你得到了一个字符串数组,你需要根据逗号分成2个字段,并在Spark Scala Dataframe convert a column of Array of Struct to a column of Map上寻找指导,我投了赞成票。您也可以使用
struct
代替Array
。返回:
为了完整性,要获得Map: