相关文章推荐
任性的机器猫  ·  潘石屹怒告神棍局 ...·  2 年前    · 
小眼睛的毛豆  ·  Python 更改 PyPI 源 -- ...·  2 年前    · 
暴走的烤地瓜  ·  (已解决) ...·  2 年前    · 
追风的茶壶  ·  Serverless Framework: ...·  2 年前    · 

版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问: https://blog.csdn.net/qq_21439395/article/details/80710180

交流QQ: 824203453

欢迎关注B站,收看更多视频内容: https://space.bilibili.com/383891492

SparkSql 版本为 2.2.0

sparksql解析json格式的数据源

首先,获取操作sparkSql的SparkSession操作实例:

val session = SparkSession.builder()
  .master("local[*]")
  .appName(this.getClass.getSimpleName)
  .getOrCreate()
// 导入隐式转换和functions
import session.implicits._
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._

1.1.  根据json数据,创建Dataset

指定嵌套json格式的数据:

val opds = session.createDataset(
  // 三引号中,编写json字符串
  List("""{"name":"xx","address":{"city":"bj"}}""")
val otherPeople = session.read.json(opds)
otherPeople.printSchema()

schema如下:

1.2.  读取普通json文件

json数据格式为:

val json1: DataFrame =session.read.json("jsonlog1.json")
json1.printSchema()

获取schema为:

1.3.  读取嵌套json文件

数据格式为:

val json: DataFrame = session.read.json("jsonlog2.json")
json.printSchema()

schema信息如下:

操作嵌套json的方式:

//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() 

explodeDFschema信息为:

最终,查询结果为:

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格式的数据源 首先,获取操作sparkSqlSparkSession操作实例: 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适用于传输更复杂的数据结构,如对象和数组。