使用 Gson 将 JSON 映射到自定义类
使用 Gson
,你可以读取 JSON 数据集并将它们映射到自定义类 MyClass
。
由于 Gson
不可序列化,因此每个执行程序都需要自己的 Gson
对象。此外,MyClass
必须是可序列化的,以便在执行程序之间传递它。
请注意,作为 json 文件提供的文件不是典型的 JSON 文件。每行必须包含一个单独的,自包含的有效 JSON 对象。因此,常规的多行 JSON 文件通常会失败。
val sc: org.apache.spark.SparkContext // An existing SparkContext
// A JSON dataset is pointed to by path.
// The path can be either a single text file or a directory storing text files.
val path = "path/to/my_class.json"
val linesRdd: RDD[String] = sc.textFile(path)
// Mapping json to MyClass
val myClassRdd: RDD[MyClass] = linesRdd.map{ l =>
val gson = new com.google.gson.Gson()
gson.fromJson(l, classOf[MyClass])
}
如果 Gson
对象的创建成本太高,可以使用 mapPartitions
方法对其进行优化。有了它,每个分区将有一个 Gson
而不是每行:
val myClassRdd: RDD[MyClass] = linesRdd.mapPartitions{p =>
val gson = new com.google.gson.Gson()
p.map(l => gson.fromJson(l, classOf[MyClass]))
}