读取文件并将行表示为向量

时间:2017-04-03 11:59:54

标签: scala apache-spark

我有一个包含DocID,WordID和频率(计数)的数据集,如下所示。 请注意,前三个数字代表1.文件数量,2 词汇表中的单词数量和3.集合中单词的总数。

189
1430
12300
1 2 1
1 39 1
1 42 3
1 77 1
1 95 1
1 96 1
2 105 1
2 108 1
3 133 3

我想要做的是读取数据(忽略前三行),合并每个文档的单词,最后将每个文档表示为包含wordID频率的向量。

基于上述数据集,文档1,2和3的表示将是(注意vocab_size可以通过数据的第二行提取):

val data = Array(
    Vectors.sparse(vocab_size, Seq((2, 1.0), (39, 1.0), (42, 3.0), (77, 1.0), (95, 1.0), (96, 1.0))),
    Vectors.sparse(vocab_size, Seq((105, 1.0), (108, 1.0))),
    Vectors.sparse(vocab_size, Seq((133, 3.0))))

问题是我不太确定如何将.txt.gz文件作为RDD读取并创建如上所述的稀疏向量数组。请注意,我实际上想要在PCA变换器中传递data数组。

1 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题:

sc.textFile("path/to/file").flatMap(r => r.split(' ') match {
  case Array(doc, word, freq) => Some((doc.toInt, (word.toInt, freq.toDouble)))
  case _ => None
}).groupByKey().mapValues(a => Vectors.sparse(vocab_size, a.toSeq))

请注意,groupByKey方法会将每个文档的所有键加载到内存中,因此您可能希望使用其变体之一reduceByKeyaggregateByKey(我希望,但是我不知道你在稀疏向量上的方法,尽管你可能有一些东西要将它们合并在一起。)