mon*_*ter 5 scala apache-spark
我有一个Scala程序,可以在一台计算机上正常工作.但是,我想让它在多个节点上工作.
程序的开头看起来像这样:
val filename = Source.fromFile("file://...")
val lines = filename.getLines
val linesArray = lines.map(x => x.split(" ").slice(0, 3))
val mapAsStrings = linesArray.toList.groupBy(_(0)).mapValues(x => x.map(_.tail))
val mappedUsers = mapAsStrings map {case (k,v) => k -> v.map(x => x(0) -> x(1).toInt).toMap}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用Spark运行程序时,我知道我需要一个SparkContext和SparkConf对象,并且它们用于创建RDD.
所以现在我有:
class myApp(filePath: String) {
private val conf = new SparkConf().setAppName("myApp")
private val sc = new SparkContext(conf)
private val inputData = sc.textFile(filePath)
Run Code Online (Sandbox Code Playgroud)
inputData现在是一个RDD,它在之前的程序中是等价的filename(我假设).对于一个RDD方法是不同的.那么,相当于getLines什么?或者没有相应的?我很难想象RDD给我的工作内容,例如是inputData一个Array[String]还是别的什么?
谢谢
RDD 是一个分布式集合,因此从概念上讲,它与 List、Array 或 Seq 没有太大区别,为您提供了可让您转换元素集合的函数操作。与 Scala 集合的主要区别在于 RDD 本质上是分布式的。给定一个 Spark 集群,当创建 RDD 时,它所代表的集合会在该集群的某些节点上进行分区。
rdd.textFile(...)返回一个RDD[String]. 给定一个分布式文件系统,每个工作人员都会将一个片段或该文件加载到一个“分区”中,在那里可以进行进一步的转换和操作(用 Spark 术语来说)。
鉴于 Spark API 与 Scala 集合 API 非常相似,一旦您拥有 RDD,对其应用函数转换与使用 Scala 集合执行的操作非常相似。
因此,您的 Scala 程序可以轻松移植到 Spark:
//val filename = Source.fromFile("file://...")
//val lines = filename.getLines
val rdd = sc.textFile("file://...")
//val linesArray = lines.map(x => x.split(" ").slice(0, 3))
val lines = rdd.map(x => x.split(" ").slice(0, 3))
//val mapAsStrings = linesArray.toList.groupBy(_(0)).mapValues(x => x.map(_.tail))
val mappedLines = lines.groupBy(_(0)).mapValues(x => x.map(_.tail))
//val mappedUsers = mapAsStrings map {case (k,v) => k -> v.map(x => x(0) -> x(1).toInt).toMap}
val mappedUsers = mappedLines.mapValues{v => v.map(x => x(0) -> x(1).toInt).toMap}
Run Code Online (Sandbox Code Playgroud)
一个重要的区别是,不存在作为 RDD 的关联“Map”集合。因此,mappedUsers是元组的集合(String, Map[String,String])