Spark: обработка полей, допускающих значение NSON - PullRequest
0 голосов
/ 11 декабря 2019

Я уже задавал вопрос по этому вопросу, но это было для 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?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2019

Это обходной путь, который я нашел на данный момент.

ds.withColumn("value",regexp_replace($"value","null", s"""""""")).as[String]

Вывод:

jsonDF.show(false)

+--------------------------------------------------+
|Title                                             |
+--------------------------------------------------+
|{"titleDesc":"","titleId":"111","titleName":"AAA"}|
|{"titleDesc":"","titleId":"222","titleName":"BBB"}|
|{"titleDesc":"","titleId":"333","titleName":"CCC"}|
|{"titleDesc":"","titleId":"444","titleName":"DDD"}|
|{"titleDesc":"","titleId":"555","titleName":"EEE"}|
+--------------------------------------------------+
0 голосов
/ 11 декабря 2019

Как насчет этого?

spark.read.json(spark.read.textFile("file.txt")).withColumn("title",struct(col("title.titleId"),col("title.titleName"),lit("").as("titleDesc"))).select(to_json('title)).show(false)
...