第一次发帖,用 Scala 学习 Spark 编码:
我有一个输入 json 字符串,其中包含 json 字符串数组。例如 { “交货证明”: { "POD_TYPE_CD": "P", “LD_REFS”:[ { "REF_NBR": "14272260", "REF_DSC": "描述111" }, { "REF_NBR": "34234371", “REF_DSC”:“” }, { "REF_NBR": "1 - 初始拾取", "REF_DSC": "停止订单" } ] } } 我想用 null 替换所有出现的空字符串。所以上面出现了一次空字符串,应该用 null 替换。我知道如何使用“普通”列(例如上面的 POD_TYPE_CD)执行此操作,但是如何对数组内的字段执行此操作?总而言之,我不想更改任何值,基本上我的输入将成为输出,但所有空字符串都需要为空(所以在上面,它将是 "REF_DSC":null )
任何建议或指导都会很棒!
我尝试使用爆炸,我尝试了地图,但它们都不起作用,而且我还没有很好地了解它是如何工作的。我在上面描述了我期望的输出是什么样子。
通过结合人们的其他帖子,我能够弄清楚: 首先,通过使用此命令,我能够从输入中获取 json 字符串: .withColumn("LD_REFS", (get_json_object(to_json(col("record.proofOfDelivery")), "$.LD_REFS")).cast("string"))
然后通过使用以下内容,我能够首先用 null 替换所有空字符串,然后将其转回结构化数组(这样输出看起来与输入相同,只不过不是空字符串而是 null)
val updateDF=inputDF .withColumn("LD_REFS", regexp_replace(col("LD_REFS"),"""","null")) .withColumn("LD_REFS", from_json(col("LD_REFS"), ArrayType(new StructType().add("REF_DSC",StringType).add("REF_NBR",StringType))))
我的输出看起来像这样 “LD_REFS”:[ { “REF_DSC”:空, "REF_NBR": "14272260" }, { “REF_DSC”:空, “REF_NBR”:“34234371” }, { "REF_DSC": "止损订单", "REF_NBR": "1 - 初始拾取" }, { "REF_DSC": "联运集团(旧)ID", “REF_NBR”:“3114762” } ]