2015-11-26 4 views
2

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

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 представляют собой массив с скобками и несколькими элементами внутри. Вот почему Spark не может точно угадать структуру. Так что проблема исходит от поколения этого JSON. Мне нужно изменить его, чтобы сделать каждый TUPLE_CRA массив, даже если только один элемент внутри.

 Смежные вопросы

  • Нет связанных вопросов^_^