web-dev-qa-db-fra.com

comment lire json avec un schéma dans spark dataframes / spark sql

sql/dataframes, aidez-moi s'il vous plaît ou fournissez une bonne suggestion sur la façon de lire ce json

{
    "billdate":"2016-08-08',
    "accountid":"xxx"
    "accountdetails":{
        "total":"1.1"
        "category":[
        {
            "desc":"one",
            "currentinfo":{
            "value":"10"
        },
            "subcategory":[
            {
                "categoryDesc":"sub",
                "value":"10",
                "currentinfo":{
                    "value":"10"
                }
            }]
        }]
    }
}

Merci,

8
raj kumar

Il semble que votre json ne soit pas valide. veuillez vérifier avec http://www.jsoneditoronline.org/

Veuillez voir an-introduction-to-json-support-in-spark-sql.html

si vous souhaitez vous inscrire comme table, vous pouvez vous inscrire comme ci-dessous et imprimer le schéma.

DataFrame df = sqlContext.read().json("/path/to/validjsonfile").toDF();
    df.registerTempTable("df");
    df.printSchema();

Voici un exemple d'extrait de code

DataFrame app = df.select("toplevel");
        app.registerTempTable("toplevel");
        app.printSchema();
        app.show();
DataFrame appName = app.select("toplevel.sublevel");
        appName.registerTempTable("sublevel");
        appName.printSchema();
        appName.show();

Exemple avec scala:

{"name":"Michael", "cities":["palo alto", "menlo park"], "schools":[{"sname":"stanford", "year":2010}, {"sname":"berkeley", "year":2012}]}
{"name":"Andy", "cities":["santa cruz"], "schools":[{"sname":"ucsb", "year":2011}]}
{"name":"Justin", "cities":["portland"], "schools":[{"sname":"berkeley", "year":2014}]}

 val people = sqlContext.read.json("people.json")
people: org.Apache.spark.sql.DataFrame

Lecture du champ de niveau supérieur

val names = people.select('name).collect()
names: Array[org.Apache.spark.sql.Row] = Array([Michael], [Andy], [Justin])

 names.map(row => row.getString(0))
res88: Array[String] = Array(Michael, Andy, Justin)

Utilisez la méthode select () pour spécifier le champ de niveau supérieur, collect () pour le collecter dans un tableau [Row] et la méthode getString () pour accéder à une colonne à l'intérieur de chaque Row.

Aplatir et lire un tableau JSON

chaque personne a un éventail de "villes". Aplatissons ces tableaux et lisons tous leurs éléments.

val flattened = people.explode("cities", "city"){c: List[String] => c}
flattened: org.Apache.spark.sql.DataFrame

val allCities = flattened.select('city).collect()
allCities: Array[org.Apache.spark.sql.Row]

 allCities.map(row => row.getString(0))
res92: Array[String] = Array(palo alto, menlo park, santa cruz, portland)

La méthode explode () explose, ou aplatit, le tableau des villes dans une nouvelle colonne nommée "ville". Nous utilisons ensuite select () pour sélectionner la nouvelle colonne, collect () pour la collecter dans un tableau [Row] et getString () pour accéder aux données à l'intérieur de chaque ligne.

Lire un tableau d'objets JSON imbriqués, non aplati

lire les données "écoles", qui sont un tableau d'objets JSON imbriqués. Chaque élément du tableau contient le nom et l'année de l'école:

 val schools = people.select('schools).collect()
schools: Array[org.Apache.spark.sql.Row]


val schoolsArr = schools.map(row => row.getSeq[org.Apache.spark.sql.Row](0))
schoolsArr: Array[Seq[org.Apache.spark.sql.Row]]

 schoolsArr.foreach(schools => {
    schools.map(row => print(row.getString(0), row.getLong(1)))
    print("\n")
 })
(stanford,2010)(berkeley,2012) 
(ucsb,2011) 
(berkeley,2014)

Utilisez select() et collect() pour sélectionner le tableau "écoles" et collectez-le dans un Array[Row]. Maintenant, chaque tableau "écoles" est de type List[Row], Nous le lisons donc avec la méthode getSeq[Row](). Enfin, nous pouvons lire les informations pour chaque école individuelle, en appelant getString() pour le nom de l'école et getLong() pour l'année scolaire.

7
Ram Ghadiyaram

Vous pouvez essayer le code suivant pour lire le fichier JSON basé sur le schéma dans Spark 2.2

import org.Apache.spark.sql.types.{DataType, StructType}

//Read Json Schema and Create Schema_Json
val schema_json=spark.read.json("/user/Files/ActualJson.json").schema.json

//add the schema 
val newSchema=DataType.fromJson(schema_json).asInstanceOf[StructType]

//read the json files based on schema
val df=spark.read.schema(newSchema).json("Json_Files/Folder Path")
10
Raghavan