Как вывести схему файлов JSON? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть следующая строка в Java

{
    "header": {
        "gtfs_realtime_version": "1.0",
        "incrementality": 0,
        "timestamp": 1528460625,
        "user-data": "metra"
    },
    "entity": [{
            "id": "8424",
            "vehicle": {
                "trip": {
                    "trip_id": "UP-N_UN314_V1_D",
                    "route_id": "UP-N",
                    "start_time": "06:17:00",
                    "start_date": "20180608",
                    "schedule_relationship": 0
                },
                "vehicle": {
                    "id": "8424",
                    "label": "314"
                },
                "position": {
                    "latitude": 42.10085,
                    "longitude": -87.72896
                },
                "current_status": 2,
                "timestamp": 1528460601
            }
        }
    ]
}

, представляющая документ JSON.Я хочу вывести схему в Spark Dataframe для потокового приложения .

Как я могу разделить поля строки аналогично документу CSV (где я могу позвонить .split(""))?

1 Ответ

0 голосов
/ 08 июня 2018

Цитирование официальной документации Вывод схемы и раздел потоковой передачи DataFrames / Datasets :

По умолчанию для структурированной потоковой передачи из файловых источников требуется указать схему, а неположитесь на Spark, чтобы сделать вывод автоматически.Это ограничение гарантирует, что согласованная схема будет использоваться для потокового запроса даже в случае сбоев.Для специальных случаев использования вы можете снова включить вывод схемы, установив для spark.sql.streaming.schemaInference значение true.

Затем можно использовать свойство конфигурации spark.sql.streaming.schemaInference, чтобы включить вывод схемы.Я не уверен, сработает ли это для файлов JSON.

Обычно я загружаю один файл (в пакетном запросе и перед началом потокового запроса), чтобы вывести схему.Это должно работать в вашем случае.Просто сделайте следующее.

// I'm leaving converting Scala to Java as a home exercise
val jsonSchema = spark
  .read
  .option("multiLine", true) // <-- the trick
  .json("sample.json")
  .schema
scala> jsonSchema.printTreeString
root
 |-- entity: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- id: string (nullable = true)
 |    |    |-- vehicle: struct (nullable = true)
 |    |    |    |-- current_status: long (nullable = true)
 |    |    |    |-- position: struct (nullable = true)
 |    |    |    |    |-- latitude: double (nullable = true)
 |    |    |    |    |-- longitude: double (nullable = true)
 |    |    |    |-- timestamp: long (nullable = true)
 |    |    |    |-- trip: struct (nullable = true)
 |    |    |    |    |-- route_id: string (nullable = true)
 |    |    |    |    |-- schedule_relationship: long (nullable = true)
 |    |    |    |    |-- start_date: string (nullable = true)
 |    |    |    |    |-- start_time: string (nullable = true)
 |    |    |    |    |-- trip_id: string (nullable = true)
 |    |    |    |-- vehicle: struct (nullable = true)
 |    |    |    |    |-- id: string (nullable = true)
 |    |    |    |    |-- label: string (nullable = true)
 |-- header: struct (nullable = true)
 |    |-- gtfs_realtime_version: string (nullable = true)
 |    |-- incrementality: long (nullable = true)
 |    |-- timestamp: long (nullable = true)
 |    |-- user-data: string (nullable = true)

Хитрость заключается в том, чтобы использовать опцию multiLine, чтобы весь файл представлял собой одну строку, из которой вы выводите схему.

...