scala – 相当于Apache Spark RDD中的getLines
我有一个
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} 当我尝试使用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) 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} 一个重要的区别是没有关联的“Map”集合作为RDD.因此,mappedUsers是元组的集合(String,Map [String,String]) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |