使用 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]))
}