spark-sql读取嵌套json数据

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文件

在这里插入图片描述

1.3. 读取嵌套json文件

在这里插入图片描述

1.4. 操作嵌套json数组-explode函数

在这里插入图片描述
解决方案:

利用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() 

在这里插入图片描述

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

在这里插入图片描述
更多复杂操作:可参考:https://cloud.tencent.com/developer/article/1032532

val rdd = spark.read.format(“json”).load("/user/log/event/20200903*")
rdd.show(false)
rdd.printSchema()
rdd.createOrReplaceTempView(“event”)
spark.sql(“select count(*) from event where event=‘h5_complete_order’ and product_id=219”).show()

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

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

交流QQ: 824203453

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值