Spark应用程序读取动态JSON字段';JSON文件中的值

Spark应用程序读取动态JSON字段';JSON文件中的值,json,scala,apache-spark,apache-spark-sql,Json,Scala,Apache Spark,Apache Spark Sql,我有一个spark应用程序试图读取几个JSON文件。每个文件都表示为。但是,每个文件的特殊_字段将具有不同的键/值。它没有一致的架构 { "name": "Bob", "age": 35, "special_field": { "my_field1": "abc" "my_field2": 12345 "my_field3": "xyz" } } 代码: 这个问题与JSON输入文件中的字段特殊_字段有关。它是动态的

我有一个spark应用程序试图读取几个JSON文件。每个文件都表示为。但是,每个文件的特殊_字段将具有不同的键/值。它没有一致的架构

{
    "name": "Bob",
    "age": 35,
    "special_field": {
        "my_field1": "abc"
        "my_field2": 12345
        "my_field3": "xyz"
    }
}
代码:

这个问题与JSON输入文件中的字段
特殊_字段
有关。它是动态的,因为模式是意外的。例如,键/值在时间之前是未知的


如果可能的话,我想把它作为JSONObject读入MyObject类。我尝试了上面的方法,但它似乎抛出了一个无法转换为任何异常的异常。是否可以将此字段的值作为JSONObject或任何类似内容读取?

我对scala不是很熟悉,但大多数情况下,您可以将JSONObject强制转换为JSONArray,并在其上调用迭代器,然后使用map.entry接口获取键和值

为什么需要Spark读取JSON?可能是1)读取2)转换为DF?哦,上面只是一个例子,但我将处理数千个json文件,每个文件都有多行json和其他需要转换的字段。json格式不正确:每行之后(除最后一行外)必须是公共的。第二行是数字,不是字符串?特殊的_字段每次都有不同的模式。有时键/值会有所不同。我感兴趣的是只将特殊字段作为json对象,而不必处理字段的键/值。这不是数组:对象具有不同的键,并显示为对象。如何将对象强制转换为数组?
case class MyObject(name: String, age: Int, specialField: JSONObject)

val myDataFrame = spark.read.json(path = "s3://bucket/*.json")
      .select(properties.head, properties.tail: _*)    
      .map(line =>
        MyObject(
          name = line.getAs[String]("name"),
          age = line.getAs[Int]("age"),
          specialField = line.getAs[JSONObject]("special_field")
       )).toDF