Нужно конвертировать Json в DataFrame в Scala - PullRequest
0 голосов
/ 02 февраля 2019

Вот JSON , который необходимо преобразовать

{
  "name": "Jon",
    "tags":[
            {
                "1": "San Jose",
                "2": "California",
                "3": 1987
            },
            {   
                "1": "University Ave",
                "2": "Princeton",
                "3": 1990
            }
    ]
}

Его необходимо преобразовать в DataFrame, как этот

Name  1               2            3
Jon   SanJose         California   1987
Jon   Univesity Ave   Princeton    1990

Может ли кто-нибудь помочь мне решить эту загадку.Спасибо !!

1 Ответ

0 голосов
/ 02 февраля 2019

Как я уже сказал в комментариях, 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|
// +----+--------------+----------+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...