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,
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();
{"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
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.
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 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.
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")