這裏是一個解決方案,考慮索引是基於一個和升序。
讓我們創建一些類似於文本文件中的虛擬數據。
val data = sc.parallelize(Seq("1:1 18:1", "4:1 32:1", "2:1 8:1 33:1", "1:1 6:1 11:1", "1:1 2:1 8:1 28:1"))
現在,我們可以將數據轉換成一對RDD
與指數和值。
val parsed = data.map(_.trim).map { line =>
val items = line.split(' ')
val (indices, values) = items.filter(_.nonEmpty).map { item =>
val indexAndValue = item.split(':')
val index = indexAndValue(0).toInt - 1 // Convert 1-based indices to 0-based.
val value = indexAndValue(1).toDouble
(index, value)
}.unzip
(indices.toArray, values.toArray)
}
獲取的功能
val numFeatures = parsed.map { case (indices, values) => indices.lastOption.getOrElse(0) }.reduce(math.max) + 1
的數量和最終創建載體
val vectors = parsed.map { case (indices, values) => Vectors.sparse(numFeatures, indices, values) }
vectors.take(10) foreach println
// (33,[0,17],[1.0,1.0])
// (33,[3,31],[1.0,1.0])
// (33,[1,7,32],[1.0,1.0,1.0])
// (33,[0,5,10],[1.0,1.0,1.0])
// (33,[0,1,7,27],[1.0,1.0,1.0,1.0])
地圖,分上的空間,各執:創建一個稀疏矢量 – eliasah
你怎麼知道電話號碼來自'LIBSVM'文件的數據維度? –
他需要2遍數據。 – eliasah