Scala 相当于ApacheSpark RDD中的getLines

Scala 相当于ApacheSpark RDD中的getLines,scala,apache-spark,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)).mapVa

我有一个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
a
Array[String]
还是其他什么

谢谢

似乎直接回答了这个问题:

def textFile(path: String, minPartitions: Int = defaultMinPartitions): RDD[String] 
从HDFS、本地文件系统(可在所有节点上使用)或任何支持Hadoop的文件系统URI读取文本文件,并将其作为字符串的RDD返回


因此
textFile
相当于
fromFile
getLines
,并返回一个RDD,其中每个条目都是文件中的一行
inputData
相当于
linesArray

RDD是一个分布式集合,因此从概念上讲,它与列表、数组或序列没有太大区别,为您提供了可以转换元素集合的功能操作。与Scala集合的主要区别在于RDD本身是分布式的。给定一个Spark集群,创建RDD时,它所表示的集合将在该集群的一些节点上进行分区

rdd.textFile(…)
返回一个
rdd[字符串]
。给定一个分布式文件系统,每个工作人员将把一个片段或该文件加载到一个“分区”中,在该分区中可以进行进一步的转换和操作(用Spark术语)

鉴于Spark API与Scala collections 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}

一个重要的区别是没有关联的“映射”集合作为RDD。因此,
mappedUsers
是元组的集合
(String,Map[String,String])

Rdd是从输入数据Source.fromFile(“file://...)以本地模式从本地fs读取。在集群上,您使用hdfs url,它可以看起来像“hdfs://sandbox.hortonworks.com:8020/tmp/data/sample.log“其他一切都是sameThanks,你的解释帮我弄清楚了很多!我的程序还没有完全运行,因为代码中的其他地方出现了问题(正如我使用的
foldLeft
,它不适用于RDD),但您在这一过程中确实帮助了我!