首页 > 解决方案 > 将字符串列保存为真正的 Json 值 - Scala

问题描述

我有一个用例,其中列的架构是字符串,但它实际上是一个 json(例如“”“{“a”:“b”}“””)。例如:

scala> val list = List("a" -> """ {"a":"b","c":"d"} """, "b" -> """ {"foo" : "bar"} """)
list: List[(String, String)] = List((a," {"a":"b","c":"d"} "), (b," {"foo" : "bar"} "))

scala> val df = list.toDF("colA","colB")
df: org.apache.spark.sql.DataFrame = [colA: string, colB: string]

scala> df.show(2,false)
+----+-------------------+
|colA|colB               |
+----+-------------------+
|a   | {"a":"b","c":"d"} |
|b   | {"foo" : "bar"}   |
+----+-------------------+

我需要将 df 写为 json 但对于 colB 我需要输出真正的 json 而不是字符串。例如,如果我这样做:

scala> df.repartition(1).write.json("/Users/myuser/sparkjson/3")

我以字符串形式进入 json 文件 colB:

{"colA":"a","colB":" {\"a\":\"b\",\"c\":\"d\"} "}
{"colA":"b","colB":" {\"foo\":\"bar\"} "}

但我想要的是为 colB 输出真正的 json(而不是字符串)。所以像:

{"colA":"a","colB": {"a":"b","c":"d"} }
{"colA":"b","colB": {"foo":"bar"} }

不幸的是,我没有 colB 的架构,它可以是任何有效的 json。我如何实现这一目标?

标签: jsonscalaapache-sparkapache-spark-sql

解决方案


对此解决方案不太确定,但可以尝试添加如下选项 -

scala> df.repartition(1).write.option("escapeQuotes","false").json("/Users/myuser/sparkjson/3")

推荐阅读