如何将地图转换为 Spark 的 RDD
How to convert a map to Spark's RDD
我有一个数据集,它是一些嵌套映射的形式,它的 Scala 类型是:
Map[String, (LabelType,Map[Int, Double])]
第一个String
键是每个样本的唯一标识符,值是一个包含标签(-1或1)的元组,以及一个嵌套映射,它是稀疏表示与样本关联的非零元素。
我想将这些数据加载到 Spark 中(使用 MUtil)并训练和测试一些机器学习算法。
使用LibSVM的稀疏编码将这些数据写入文件,然后加载到Spark中很容易:
writeMapToLibSVMFile(data_map,"libsvm_data.txt") // Implemeneted some where else
val conf = new SparkConf().setAppName("DecisionTree").setMaster("local[4]")
val sc = new SparkContext(conf)
// Load and parse the data file.
val data = MLUtils.loadLibSVMFile(sc, "libsvm_data.txt")
// Split the data into training and test sets
val splits = data.randomSplit(Array(0.7, 0.3))
val (trainingData, testData) = (splits(0), splits(1))
// Train a DecisionTree model.
我知道直接从 data_map
加载 data
变量应该很容易,但我不知道如何操作。
感谢任何帮助!
可以通过两种方式完成
sc.textFile("libsvm_data.txt").map(s => createObject())
- 将地图转换为对象集合并使用
sc.parallelize()
最好是第一个。
我猜你想要这样的东西
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
// If you know this upfront, otherwise it can be computed
// using flatMap
// trainMap.values.flatMap(_._2.keys).max + 1
val nFeatures: Int = ???
val trainMap = Map(
"x001" -> (-1, Map(0 -> 1.0, 3 -> 5.0)),
"x002" -> (1, Map(2 -> 5.0, 3 -> 6.0)))
val trainRdd: RDD[(String, LabeledPoint)] = sc
// Convert Map to Seq so it can passed to parallelize
.parallelize(trainMap.toSeq)
.map{case (id, (labelInt, values)) => {
// Convert nested map to Seq so it can be passed to Vector
val features = Vectors.sparse(nFeatures, values.toSeq)
// Convert label to Double so it can be used for LabeledPoint
val label = labelInt.toDouble
(id, LabeledPoint(label, features))
}}
我有一个数据集,它是一些嵌套映射的形式,它的 Scala 类型是:
Map[String, (LabelType,Map[Int, Double])]
第一个String
键是每个样本的唯一标识符,值是一个包含标签(-1或1)的元组,以及一个嵌套映射,它是稀疏表示与样本关联的非零元素。
我想将这些数据加载到 Spark 中(使用 MUtil)并训练和测试一些机器学习算法。
使用LibSVM的稀疏编码将这些数据写入文件,然后加载到Spark中很容易:
writeMapToLibSVMFile(data_map,"libsvm_data.txt") // Implemeneted some where else
val conf = new SparkConf().setAppName("DecisionTree").setMaster("local[4]")
val sc = new SparkContext(conf)
// Load and parse the data file.
val data = MLUtils.loadLibSVMFile(sc, "libsvm_data.txt")
// Split the data into training and test sets
val splits = data.randomSplit(Array(0.7, 0.3))
val (trainingData, testData) = (splits(0), splits(1))
// Train a DecisionTree model.
我知道直接从 data_map
加载 data
变量应该很容易,但我不知道如何操作。
感谢任何帮助!
可以通过两种方式完成
sc.textFile("libsvm_data.txt").map(s => createObject())
- 将地图转换为对象集合并使用
sc.parallelize()
最好是第一个。
我猜你想要这样的东西
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
// If you know this upfront, otherwise it can be computed
// using flatMap
// trainMap.values.flatMap(_._2.keys).max + 1
val nFeatures: Int = ???
val trainMap = Map(
"x001" -> (-1, Map(0 -> 1.0, 3 -> 5.0)),
"x002" -> (1, Map(2 -> 5.0, 3 -> 6.0)))
val trainRdd: RDD[(String, LabeledPoint)] = sc
// Convert Map to Seq so it can passed to parallelize
.parallelize(trainMap.toSeq)
.map{case (id, (labelInt, values)) => {
// Convert nested map to Seq so it can be passed to Vector
val features = Vectors.sparse(nFeatures, values.toSeq)
// Convert label to Double so it can be used for LabeledPoint
val label = labelInt.toDouble
(id, LabeledPoint(label, features))
}}