Непоследовательная догадка JSON-схемы с кадрами данных Spark

Попытка прочитать файл JSON с фреймами данных Spark 1.4.1 и перейти внутрь. Кажется, угаданная схема неверна.

JSON-файл:

{
    "FILE": {
        "TUPLE_CLI": [{
            "ID_CLI": "C3-00000004",
            "TUPLE_ABO": [{
                "ID_ABO": "T0630000000000004",
                "TUPLE_CRA": {
                    "CRA": "T070000550330",
                    "EFF": "Success"
                },
                "TITRE_ABO": ["Mr",
                "OOESGUCKDO"],
                "DATNAISS": "1949-02-05"
            },
            {
                "ID_ABO": "T0630000000100004",
                "TUPLE_CRA": [{
                    "CRA": "T070000080280",
                    "EFF": "Success"
                },
                {
                    "CRA": "T070010770366",
                    "EFF": "Failed"
                }],
                "TITRE_ABO": ["Mrs",
                "NP"],
                "DATNAISS": "1970-02-05"
            }]
        },
        {
            "ID_CLI": "C3-00000005",
            "TUPLE_ABO": [{
                "ID_ABO": "T0630000000000005",
                "TUPLE_CRA": [{
                    "CRA": "T070000200512",
                    "EFF": "Success"
                },
                {
                    "CRA": "T070010410078",
                    "EFF": "Success"
                }],
                "TITRE_ABO": ["Miss",
                "OB"],
                "DATNAISS": "1926-11-22"
            }]
        }]
    }
}

Искровой код:

val j = sqlContext.read.json("/user/arthur/test.json")
j.printSchema

Результат:

root
 |-- FILE: struct (nullable = true)
 |    |-- TUPLE_CLI: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- ID_CLI: string (nullable = true)
 |    |    |    |-- TUPLE_ABO: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- DATNAISS: string (nullable = true)
 |    |    |    |    |    |-- ID_ABO: string (nullable = true)
 |    |    |    |    |    |-- TITRE_ABO: array (nullable = true)
 |    |    |    |    |    |    |-- element: string (containsNull = true)
 |    |    |    |    |    |-- TUPLE_CRA: string (nullable = true)

Совершенно очевидно, что TUPLE_CRA является массивом. Я не могу понять, почему это не угадано. На мой взгляд, предполагаемая схема должна быть:

root
 |-- FILE: struct (nullable = true)
 |    |-- TUPLE_CLI: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- ID_CLI: string (nullable = true)
 |    |    |    |-- TUPLE_ABO: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- DATNAISS: string (nullable = true)
 |    |    |    |    |    |-- ID_ABO: string (nullable = true)
 |    |    |    |    |    |-- TITRE_ABO: array (nullable = true)
 |    |    |    |    |    |    |-- element: string (containsNull = true)
 |    |    |    |    |    |-- TUPLE_CRA: array (nullable = true)
 |    |    |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |    |    |-- CRA: string (nullable = true)
 |    |    |    |    |    |    |    |-- EFF: string (nullable = true)

У кого-нибудь есть объяснение? Есть ли способ с легкостью сказать Spark, какова реальная схема, если схема JSON намного сложнее?

1 ответ

Решение

Ну, наконец, понял, что JSON не является ожидаемым. Вы заметите, что первый TUPLE_CRA - это элемент без скобок []. Остальные TUPLE_CRA - это массив с скобками и несколькими элементами внутри. Это причина, по которой Спарк не может точно угадать структуру. Таким образом, проблема возникает из поколения этого JSON. Мне нужно изменить его, чтобы сделать каждый TUPLE_CRA массивом, даже если внутри только один элемент.

Другие вопросы по тегам