Как я уже сказал в комментариях, Spark поддерживает JSON очистка из коробки - вам не нужна никакая внешняя библиотека.
Spark , автоматически выведет схему вашего файла, но не сгладит данные автоматически ...
Это необходимо сделатьв вашей программе.
Вот простой пример того, как вы могли бы сделать это, используя напечатанный Dataset
.
(Примечание: файл JSON должен содержать один документна строку, как указано в документации) .
(Также обратите внимание, что я переименовал поля в a
, b
& c
, чтобы они действовали Scala идентификаторы) .
import org.apache.spark.sql.{SparkSession, Encoder}
final case class Nested(name: String, tags: List[Tag])
final case class Tag(a: String, b: String, c: Int)
final case class Flattened(name: String, a: String, b: String, c: Int)
val spark = SparkSession.builder.master("local[*]").getOrCreate()
import spark.implicits._
val nestedEncoder: Encoder[Nested] = implicitly
val nestedSchema = nestedEncoder.schema
val nestedDS =
spark
.read
.option(key = "charset", value = "UTF-8")
.schema(nestedSchema)
.json(path = "path")
.as[Nested](nestedEncoder)
val flattenedDS = for {
nested <- nestedDS
tag <- nested.tags
} yield Flattened(nested.name, tag.a, tag.b, tag.c)
// flattenedDS: Dataset[Flattened] = [name: string, a: string, b: string, c: integer]
flattenedDS.printSchema()
// root
// |-- name: string (nullable = true)
// |-- a: string (nullable = true)
// |-- b: string (nullable = true)
// |-- c: integer (nullable = false)
flattenedDS.show()
// +----+--------------+----------+----+
// |name| a| b| c|
// +----+--------------+----------+----+
// | Jon| San Jose|California|1987|
// | Jon|University Ave| Princeton|1990|
// +----+--------------+----------+----+