在 spark 中读取单行 json,其中列键是可变的

Posted

技术标签:

【中文标题】在 spark 中读取单行 json,其中列键是可变的【英文标题】:read a single line json in spark where column key is variable 【发布时间】:2017-05-13 10:22:22 【问题描述】:

我有一个单行 json 文件,如下所示

"Hotel Dream":"Guests":20,"Address":"14 Naik Street","City":"Manila","Serenity Stay":"Guests":35,"Address":"10 St Marie Road","City":"Manila"....

如果我使用以下内容读取 json 以触发上下文,则会导致

val hotelDF = sqlContext.read.json("file").printSchema

root
 |-- Hotel Dream: struct (nullable = true)
 |    |-- Address: string (nullable = true)
 |    |-- City: string (nullable = true)
 |    |-- Guests: long (nullable = true)
 |-- Serenity Stay: struct (nullable = true)
 |    |-- Address: string (nullable = true)
 |    |-- City: string (nullable = true)
 |    |-- Guests: long (nullable = true)

我想转置不同的列(Hotel Dream、Serenity Stay 等),以使数据框以正则化模式结束

Hotel: string (nullable = true)
Guests: string (nullable = true)
Address: string (nullable = true)
City: string (nullable = true)

还尝试将 json 作为 textFile 或 wholeTextFiles 注入。但是由于没有换行分隔符,我无法用map函数映射内容。

关于如何读取这种数据格式的任何输入?

【问题讨论】:

【参考方案1】:

根据我从您的问题中理解的内容,以下可能是您的解决方案(虽然它不是一个完美的解决方案)

var newDataFrame = Seq(("test", "test", "test", "test")).toDF("Hotel", "Address", "City", "Guests")
for(name <- hotelDF.schema.fieldNames) 
  val tempdf = hotelDF.withColumn("Hotel", lit(name))
    .withColumn("Address", hotelDF(name + ".Address"))
    .withColumn("City", hotelDF(name + ".City"))
    .withColumn("Guests", hotelDF(name + ".Guests"))
  val tdf = tempdf.select("Hotel", "Address", "City", "Guests")
  newDataFrame = newDataFrame.union(tdf)

newDataFrame.filter(!(col("Hotel") === "test")).show

【讨论】:

以上是关于在 spark 中读取单行 json,其中列键是可变的的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark,如何将文件中单行的多个 JSON 文档读入数据框?

Spark学习笔记——数据读取和保存

如何将 JSON 格式的单行 Spark 数据框分解为多行?

无法在 spark 中保存 AsTextFile 但能够读取输出

如何用另一个键替换散列键

为JSON创建模型,其中键是android中的值