Я пытался воспроизвести проблему с упрощенным json:
{"header": {"version": 1}, "body": {"playerid": 101, "campaignid": null}}
{"header": {"version": 2}, "body": {"playerid": 102, "campaignid": "a"}}
{"header": {"version": 3}, "body": {"playerid": 103, "campaignid": "b"}}
Также я создал классы дел для преобразования его в набор данных
import org.apache.spark.sql.Encoders
import org.apache.spark.sql.functions._
case class Header(version: Int)
case class Body(playerid: Int, campaignid: String)
case class TestJson(header: Header, body: Body)
val schema = Encoders.product[TestJson].schema
val rawpop = spark.read.format("json").schema(schema).load("/tmp/tests.json").as[TestJson]
rawpop
выглядитэто
+------+-----------+
|header| body|
+------+-----------+
| [1]| [101,]|
| [2]| [102, a]|
| [3]| [103, b]|
+------+-----------+
теперь позволяет подставить null
значение
val result = rawpop.withColumn("body", struct($"body.playerid",
when($"body.campaignid".isNull, "default_value").otherwise($"body.campaignid")))
result.show()
, теперь оно показывает
+------+--------------------+
|header| body|
+------+--------------------+
| [1]|[101, default_value]|
| [2]| [102, a]|
| [3]| [103, b]|
+------+--------------------+