Pyspark在数组中添加额外的双引号以节省时间

92dk7w1h  于 2023-02-09  发布在  Apache
关注(0)|答案(2)|浏览(146)

我有一个Spark 3.x的小集群设置。我读取了一些数据,经过转换后,我必须将其保存为JSON。但我面临的问题是,在数组类型的列中,Spark在写入json文件时会添加额外的双引号。示例数据-帧数据x1c 0d1x
我使用以下命令将此数据框保存为JSON

df.write.json("Documents/abc")

保存的输出如下所示

最后,模式信息如下所示

8yparm6h

8yparm6h1#

字符串数组的元素在数据中包含双引号,例如第一个元素是"Saddar Cantt, Lahore Punjab Pakistan"而不是Saddar Cantt, Lahore Punjab Pakistan。您可以在使用transform和replace编写json之前删除字符串中多余的双引号:

df.withColumn("ADDRESS", F.expr("""transform(ADDRESS, a -> replace(a, '"'))""")) \
    .write.json("Documents/abc")
mznpcxlj

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只接受字符串作为输入,因此我们需要先将数组转换为字符串。

相关问题