//DSL 语法的查询
json.select("address.province").show()
// 使用sql语法查询
json.createTempView("v_tmp")
session.sql("select address.city from v_tmp").show()
1.4. 操作嵌套json数组-explode函数
数据格式为:
读取json数组的数据:
val json3 = session.read.json("jsonlog3array.json")
json3.printSchema()
json3.show()
schema信息为:
示例数据为:

这种结果的展示数据,查询非常不方便。
解决方案:
利用explode函数,把数组数据进行展开。
// 导入sparksql中的函数
import org.apache.spark.sql.functions._
// 利用explode函数 把json数组进行展开, 数组中的每一条数据,都是一条记录
val explodeDF = json3.select($"name", explode($"myScore")).toDF("name", "score")
explodeDF.printSchema()
// 再次进行查询 类似于普通的数据库表 默认schema: score1, 可以通过as 指定schema名称
val json3Res: DataFrame = explodeDF.select($"name", $"score.score1",
$"score.score2" as "score222")
// 创建临时视图
json3Res.createTempView("v_jsonArray")
// 写sql,分别求平均值
session.sql("select name,avg(score1),avg(score222) from v_jsonArray group by name")
.show()
explodeDF的schema信息为:
最终,查询结果为:
1.5. get_json_object() 方法
get_json_object() 方法 从一个json 字符串中根据指定的json路径抽取一个json 对象
根据指定数据,获取一个DataFrame
val json4 = Seq(
(0, """{"device_id": 0, "device_type": "sensor-ipad", "ip": "68.161.225.1", "cn": "United States"}"""))
.toDF("id", "json")
json4.printSchema()
schema信息为:
使用get_json_object 从json字符串中提取列:
// 利用get_json_object 从 json字符串中,提取列
val jsDF = json4.select($"id",
get_json_object($"json", "$.device_type").alias("device_type"),
get_json_object($"json", "$.ip").alias("ip"),
get_json_object($"json", "$.cn").alias("cn"))
jsDF.printSchema()
schema信息为:
更多复杂操作:可参考:https://cloud.tencent.com/developer/article/1032532
版权声明:本文为博主原创文章,未经博主允许不得转载!!
欢迎访问:https://blog.csdn.net/qq_21439395/article/details/80710180
交流QQ: 824203453
欢迎关注B站,收看更多视频内容:https://space.bilibili.com/383891492
版权声明:本文为博主原创文章,未经博主允许不得转载!!欢迎访问:https://blog.csdn.net/qq_21439395/article/details/80710180交流QQ: 824203453欢迎关注B站,收看更多视频内容:https://space.bilibili.com/383891492SparkSql 版本为 2.2.0sparksql解析j...
tiny-json 是一个通用且易于使用的 json 解析器,用 C 语言编写,适用于嵌入式系统。它快速、坚固且便携。
它不仅是一个标记器。您可以访问字符串格式的 json 数据或直接将原始值作为 C 类型变量获取,而不会损失任何性能。
您可以一对一地访问 JSON 字段或通过名称获取它们的值。这可以帮助您节省大量源代码行和开发时间。
它不使用递归。
它不使用动态内存。您使用的内存可以静态保留。
数组或 json 对象中的嵌套级别没有限制。
JSON 属性数量限制由可以静态保留的缓冲区大小确定。
更多详情、使用方法,请下载后阅读README.md文件
1 json 数据集
{"pid":123456,"aid":"abcdefg","country":"MX","places":[{"place":7,"type":"open"},{"place":10,"type":"open"},{"place":13,"type":"open"}]}
package dir1
import org.apache.spark.sql.types.{StringType, StructType}
import org.apache.spark.sql.{
一、问题现象:使用spark sql调用get_json_object函数后,报如下错误:yarn 容器被kill,导致任务失败,查看日志:Container killed by YARN for exceeding memory limits
使用spark命令:
/opt/software/spark-2.2.0-bin-hadoop2.6/bin/spark-sql \
--master ...
第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;如果输入的json字符串无效,那么返回NULL。
data 为 test表中的字段,数据结构如下:
data =
"store":
"fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear
sparksql解析json格式的数据源
首先,获取操作sparkSql的SparkSession操作实例:
val session = SparkSession.builder()
.master(“local[*]”)
.appName(this.getClass.getSimpleName)
.getOrCreate()
// 导入隐式转换和functions
import session.implicits._
import org.apache.spark.s
{"username":"king","actionInfo":{"id":1,"age":"22","partList":[{"code":"123","uname":"king"},{"code":"0012","uname":"king"}]}}
//方法一:用sql风格处理嵌套json
val...
使用spark sql 的时候,加载json数据作为表的基础数据。发现其中的json数据中有些字段对应的是一个嵌套数组:
{“schema1”:"hello",“schema2” : [ {"a":1","b":"11"}, {“a”:"2","b":"22"}…… ]
将json数据加载到spark sql 中:
val sqlContext = new org.apache.spark.
x-www-form-urlencoded和json都是常见的数据传输格式。
x-www-form-urlencoded是一种将表单数据编码为键值对的方式,其中键和值之间用等号连接,不同的键值对之间用&符号连接。这种格式通常用于HTTP POST请求中,用于向服务器提交表单数据。
json是一种轻量级的数据交换格式,它采用键值对的方式来表示数据,其中键和值之间用冒号连接,不同的键值对之间用逗号连接。json格式通常用于Web API中,用于传输数据。
总的来说,x-www-form-urlencoded适用于传输简单的表单数据,而json适用于传输更复杂的数据结构,如对象和数组。