Cómo crear un esquema para que el siguiente json lea el esquema. Estoy usando hiveContext.read.schema (). Json ("input.json"), y quiero ignorar los dos primeros informes de sólo lectura "ErrorMessage" e "IsError". A continuación se muestra el JSON:

 {  
  "ErrorMessage": null,
  "IsError": false,
   "Report":{  
      "tl":[  
         {  
            "TlID":"F6",
            "CID":"mo"
         },
         {  
            "TlID":"Fk",
            "CID":"mo"
         }
      ]
   }
}

Creé el siguiente esquema:

val schema = StructType(
            Array(
                   StructField("Report", StructType(
                     Array(
                                                     StructField
                                                     ("tl",ArrayType(StructType(Array(
                                                                    StructField("TlID", StringType),
                                                                    StructField("CID", IntegerType)
                                                                  )))))))))

Below is my json.printSchema() :
root
 |-- Report: struct (nullable = true)
 |    |-- tl: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- TlID: string (nullable = true)
 |    |    |    |-- CID: integer (nullable = true)
1
Divya 15 nov. 2017 a las 18:11

2 respuestas

La mejor respuesta

El esquema es incorrecto. CID en sus datos claramente no es String ("mo"). Utilizar

val schema = StructType(Array(
  StructField("Report", StructType(
    Array(
        StructField
        ("tl",ArrayType(StructType(Array(
                       StructField("CID", StringType),
                       StructField("TlID", StringType)
                          )))))))))

Y:

val df = Seq("""{  
  "ErrorMessage": null,
  "IsError": false,
   "Report":{  
      "tl":[  
         {  
            "TlID":"F6",
            "CID":"mo"
         },
         {  
            "TlID":"Fk",
            "CID":"mo"
         }
      ]
   }
}""").toDS

spark.read.schema(schema).json(df).show(false)
+--------------------------------+
|Report                          |
+--------------------------------+
|[WrappedArray([mo,F6], [mo,Fk])]| 
+--------------------------------+ 
2
user8946376 15 nov. 2017 a las 16:09
Datatype: array<struct<metrics_name:string,metrics_value:string>>


  import org.apache.spark.sql.types.{ArrayType}

  StructField("usage_metrics", ArrayType(StructType(
    Array(
      StructField("metric_name", StringType, true),
      StructField("metric_value", StringType, true)
    )
  ))))
-1
Rajiv Singh 10 feb. 2020 a las 16:06