gpt4 book ai didi

scala - 如何在Spark DataFrames/Spark SQL中使用架构读取JSON

转载 作者:行者123 更新时间:2023-12-04 05:11:50 27 4
gpt4 key购买 nike

sql/dataframes,
请帮帮我或就如何阅读此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"
}
}]
}]
}
}

谢谢,

最佳答案

似乎您的json无效。
请用http://www.jsoneditoronline.org/检查

请参阅an-introduction-to-json-support-in-spark-sql.html

如果您想注册为表格,可以像下面一样注册并打印模式。

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

以下是示例代码段
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();

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

阅读顶级字段
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)

使用select()方法指定顶级字段,使用collect()将其收集到Array [Row]中,并使用getString()方法访问每个Row中的列。

展平并读取JSON数组

每个人都有一组“城市”。让我们展平这些数组并读出它们的所有元素。
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)

explode()方法将城市阵列爆炸或展平到名为“city”的新列中。然后,我们使用select()选择新列,使用collect()将其收集到Array [Row]中,并使用getString()访问每个Row中的数据。

读取未拼合的嵌套JSON对象数组

读取“学校”数据,该数据是嵌套的JSON对象的数组。数组的每个元素都包含学校名称和年份:
 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)

使用 select()collect()选择“schools”数组并将其收集到 Array[Row]中。现在,每个“schools”数组的类型均为 List[Row],因此我们使用 getSeq[Row]()方法将其读出。最后,我们可以通过为学校名称调用 getString()和为学年调用 getLong()来读取每所学校的信息。

关于scala - 如何在Spark DataFrames/Spark SQL中使用架构读取JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39355149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com