Я уже задавал вопрос по этому вопросу, но это было для Array type column
. Сначала считалось, что проблема возникает только для полей массива JSON, но похоже, что это происходит даже для простого скалярного поля.
Ниже приведены данные, которые я загружаю.
val ds = spark.read.textFile("./src/main/resources/json/jsonwithnullfield.txt").as[String]
ds.show(false)
+--------------------------------------------------------------------+
|value |
+--------------------------------------------------------------------+
|{"title": {"titleId": "111", "titleName": "AAA", "titleDesc": null}}|
|{"title": {"titleId": "222", "titleName": "BBB", "titleDesc": null}}|
|{"title": {"titleId": "333", "titleName": "CCC", "titleDesc": null}}|
|{"title": {"titleId": "444", "titleName": "DDD", "titleDesc": null}}|
|{"title": {"titleId": "555", "titleName": "EEE", "titleDesc": null}}|
+--------------------------------------------------------------------+
Затем загрузил набор данных [String] в виде JSON, и я вижу все столбцы в поле schema
, включая titleDesc
.
val jsonDF = spark.read.json(ds)
jsonDF.printSchema()
jsonDF.show(false)
root
|-- title: struct (nullable = true)
| |-- titleDesc: string (nullable = true)
| |-- titleId: string (nullable = true)
| |-- titleName: string (nullable = true)
+------------+
|title |
+------------+
|[, 111, AAA]|
|[, 222, BBB]|
|[, 333, CCC]|
|[, 444, DDD]|
|[, 555, EEE]|
+------------+
Затем я использовал to_json function
для преобразования значения title
в JSON, но результаты, похоже, не работают должным образом, так как я не вижу поля titleDesc
в значении JSON.
jsonDF.select(to_json(struct($"title.*")).as("Title")).show(false)
Вывод:
+-----------------------------------+
|Title |
+-----------------------------------+
|{"titleId":"111","titleName":"AAA"}|
|{"titleId":"222","titleName":"BBB"}|
|{"titleId":"333","titleName":"CCC"}|
|{"titleId":"444","titleName":"DDD"}|
|{"titleId":"555","titleName":"EEE"}|
+-----------------------------------+
Я хотел бы видеть поле titleDesc
в выходной строке JSON. Есть ли обходной путь, если это не может быть обработано с помощью функции to_json
?