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
答案 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