将DataFrame写入json时排除列标题

时间:2018-12-13 15:37:44

标签: json scala apache-spark dataframe databricks

我有以下数据框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”。有什么建议吗?

2 个答案:

答案 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>)

希望有帮助。