如何使用Spark

时间:2015-05-15 07:32:06

标签: apache-spark rdd

Spark提供方法saveAsTextFile,可以轻松地将RDD[T]存储到磁盘或hdfs中。

T是一个任意可序列化的类。

我想要扭转操作。 我想知道是否有loadFromTextFile可以轻松地将文件加载到RDD[T]

让我说清楚:

class A extends Serializable {
...
}

val path:String = "hdfs..."
val d1:RDD[A] = create_A

d1.saveAsTextFile(path)

val d2:RDD[A] = a_load_function(path) // this is the function I want

//d2 should be the same as d1

3 个答案:

答案 0 :(得分:10)

尝试使用d1.saveAsObjectFile(path)存储并加载val d2 = sc.objectFile[A](path)

我认为你不能saveAsTextFile在没有RDD[A]转换的情况下将其读作RDD[String]

答案 1 :(得分:0)

要创建基于文件的RDD,我们可以使用SparkContext.textFile API

以下是一个例子:

val textFile = sc.textFile(“input.txt”)

我们可以明确指定URI。

如果文件是HDFS:
sc.textFile( “HDFS://主机:端口/文件路径”)

如果文件位于本地:
sc.textFile(“file:///文件路径/”)

如果文件是S3:

s3.textFile( “S3N://mybucket/sample.txt”);

将RDD加载到Speicific类型:

案例类Person(name:String,age:Int)

val people = sc.textFile(“employees.txt”)。map(_。split(“,”))。map(p => Person(p(0),p(1).trim.toInt ))

在这里,人们的类型为org.apache.spark.rdd.RDD [Person]

答案 2 :(得分:-1)

如果你想要一个架构,你可能想要使用一个包含它的输出类型(比如Avro,镶木地板等) 否则在加载时你必须映射RDD并将其转换为你想要的模式(类型)。

正如丹麦语所建议的那样,您可能需要考虑使用基于模式概念构建的SparkSQL / DataFrame