我有以下数据框df1
SomeJson
=================
[{
"Number": "1234",
"Color": "blue",
"size": "Medium"
}, {
"Number": "2222",
"Color": "red",
"size": "Small"
}
]
并且我正在尝试仅将此列的内容作为json写入blob存储。
df1.select("SomeJson")
.write
.option("header", false)
.mode("append")
.json(blobStorageOutput)
此代码有效,但它在blob存储中创建以下json。
{
"SomeJson": [{
"Number": "1234",
"Color": "blue",
"size": "Medium"
}, {
"Number": "2222",
"Color": "red",
"size": "Small"
}
]
}
但是我只希望该列的内容而不是Header列,我也不想在最终Json中使用“ SomeJson”。有什么建议吗?
答案 0 :(得分:1)
如果您不希望追加数据框列,则将数据框写为text
而不是json
。只会写入您列的内容。
df1.select("SomeJson")
.write
.option("header", false)
.mode("append")
.text(blobStorageOutput)
答案 1 :(得分:0)
这个问题只是一个附加假设,
我们从数据集中派生JSON结构本身,然后遇到像此处这样的标头场景。我们可以采用以下方法。
spark.sql("SELECT COLLECT_SET(STRUCT(<field_name>)) AS `` FROM <table_name> LIMIT 1").coalesce(1).write.format("org.apache.spark.sql.json").mode("overwrite").save(<Blob Path1/ ADLS Path1>)
输出将类似于
{"":[{<field_name>:<field_value>}]}
在这里可以通过遵循以下三行来避免标题(假设数据中没有蒂尔达),
jsonToCsvDF=spark.read.format("com.databricks.spark.csv").option("delimiter", "~").load(<Blob Path1/ ADLS Path1>)
jsonToCsvDF.createOrReplaceTempView("json_to_csv")
spark.sql("SELECT SUBSTR(`_c0`,5,length(`_c0`)-5) FROM json_to_csv").coalesce(1).write.option("header",false).mode("overwrite").text(<Blob Path2/ ADLS Path2>)
希望有帮助。