apache-spark 使用Gson将JSON映射到自定义类

示例

使用Gson,您可以读取JSON数据集并将其映射到自定义类MyClass。

由于Gson不可序列化,因此每个执行程序都需要自己的Gson对象。而且,MyClass必须可序列化才能在执行程序之间传递。

请注意,file(s)作为json文件提供的并不是典型的JSON文件。每行必须包含一个单独的,自包含的有效JSON对象。因此,常规的多行JSON文件通常会失败。

val sc: org.apache.spark.SparkContext // 现有的SparkContext

// 路径指向JSON数据集。
// 该路径可以是单个文本文件,也可以是存储文本文件的目录。
val path = "path/to/my_class.json"
val linesRdd: RDD[String] = sc.textFile(path)

// 将json映射到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]))
}