我有一个Spark 3.x的小集群设置。我读取了一些数据,经过转换后,我必须将其保存为JSON。但我面临的问题是,在数组类型的列中,Spark在写入json文件时会添加额外的双引号。示例数据-帧数据x1c 0d1x我使用以下命令将此数据框保存为JSON
df.write.json("Documents/abc")
保存的输出如下所示
最后,模式信息如下所示
8yparm6h1#
字符串数组的元素在数据中包含双引号,例如第一个元素是"Saddar Cantt, Lahore Punjab Pakistan"而不是Saddar Cantt, Lahore Punjab Pakistan。您可以在使用transform和replace编写json之前删除字符串中多余的双引号:
"Saddar Cantt, Lahore Punjab Pakistan"
Saddar Cantt, Lahore Punjab Pakistan
df.withColumn("ADDRESS", F.expr("""transform(ADDRESS, a -> replace(a, '"'))""")) \ .write.json("Documents/abc")
mznpcxlj2#
如果我们在将 Dataframe 写为json之前强制执行schema,我相信我们可以解决这些问题,而不必替换/更改任何字符。无模式-〉
df.show() id | address 1 | ['Saddar Cantt, Lahore Punjab Pakistan', 'Shahpur'] df.write.json("path")
{“id”:“1”,“address”:[“”巴基斯坦旁遮普省拉合尔市萨达尔坎特“”,“”沙赫普尔“"]}
使用架构-〉
df = df.withColumn('address', F.col('address').cast(StringType())) df = df.withColumn('address', F.from_json(F.col('address'), ArrayType(StringType()))) df.write.json("path")
{“id”:“1”,“地址”:[“巴基斯坦旁遮普省拉合尔市萨达尔坎特”,“沙赫普尔”]}
from_json只接受字符串作为输入,因此我们需要先将数组转换为字符串。
2条答案
按热度按时间8yparm6h1#
字符串数组的元素在数据中包含双引号,例如第一个元素是
"Saddar Cantt, Lahore Punjab Pakistan"
而不是Saddar Cantt, Lahore Punjab Pakistan
。您可以在使用transform和replace编写json之前删除字符串中多余的双引号:mznpcxlj2#
如果我们在将 Dataframe 写为json之前强制执行schema,我相信我们可以解决这些问题,而不必替换/更改任何字符。
无模式-〉
{“id”:“1”,“address”:[“”巴基斯坦旁遮普省拉合尔市萨达尔坎特“”,“”沙赫普尔“"]}
使用架构-〉
{“id”:“1”,“地址”:[“巴基斯坦旁遮普省拉合尔市萨达尔坎特”,“沙赫普尔”]}
from_json只接受字符串作为输入,因此我们需要先将数组转换为字符串。