众所周知,在早期Spark版本中就已经支持读取Json格式的数据文件,并能够直接转换为数据库表,以方便我们进行处理数据,在本篇文章中我们将介绍如何通过Spark API很简单地读取Json数据,并进一步讲解,读取复杂Json中的嵌套数组。

本次使用的各个组件版本设定如下:

Spark: 2.1.0

Scala 2.11.8

Hadoop 2.6.2

加载Json数据

我们可以简单地通过SQLContext读取Json文件

val dfSQLContext = sqlContext.read.json("/user/hadoop/flume/my_crawler_jd_report/*/*")

或者通过SparkSession读取Json文件

val dfSparkSession = spark.read.json("/user/hadoop/flume/my_crawler_jd_report/*/*")

以上两种方式读取的结果是一样的

scala> val dfSQLContext = sqlContext.read.json("/user/hadoop/flume/my_crawler_jd_report/*/*")

dfSQLContext: org.apache.spark.sql.DataFrame = [addTime: string, channel: string ... 3 more fields]

scala> val dfSparkSession = spark.read.json("/user/hadoop/flume/my_crawler_jd_report/*/*")

dfSparkSession: org.apache.spark.sql.DataFrame = [addTime: string, channel: string ... 3 more fields]

现在我们来看下整个Json的数据结构

scala> dfSparkSession.printSchema

root

|-- addTime: string

|-- channel: string

|-- consume_time: string

|-- message: struct

|    |-- addressInfo: array

|    |    |-- element: struct

|    |    |    |-- address: string

|    |    |    |-- addressLabel: string

|    |    |    |-- consignee: string

|    |    |    |-- email: string

|    |    |    |-- phoneNumber : string

|    |    |    |-- region: string

|    |-- certifyInfo: struct

|    |    ...结构比较复杂,此处省略

|-- sUserId: string (nullable = true)

因为结构比较复杂,直接挑重点进行讲解,在这里我们先看下addressInfo这个节点,节点中存储的是数组(array)形式的多条(struct)用户地址信息,地址信息中又包含了编号,手机号,地址等详细信息。

嵌套数组结构

打平/分解数组

如果Json对象中包含了数组结构,我们应该如何访问到数组中的元素呢?有一种方法就是直接将这条数据中的数组打平成多条数据,也就是一条记录拆分成多条记录,在这里我们可以直接通过explode()函数实现

scala> val dfDetails = dfSQLContext.select(dfSQLContext("sUserId"),explode(dfSQLContext("message.addressInfo"))).toDF("userid","addressInfo")

scala> dfDetails.printSchema

root

|-- userid: string

|-- addressInfo: struct

|    |-- address: string

|    |-- addressLabel: string

|    |-- consignee: string

|    |-- email: string

|    |-- phoneNumber : string

|    |-- region: string

|    |-- telephoneNumber: string

现在我们已经将addressInfo打平成一条条记录,不再是数组结构的数据了。

这样就可以很简单的通过select来读取struct结构中的数据了,我们通过addressInfo.address来读取详细地址信息:

scala> val dfDetailsAddress = dfDetails.select("addressInfo.address")

scala> dfDetailsAddress.show(10)

+--------------------+

|             address|

+--------------------+

|师大京东派|

|障岗村广东青年职业学院|

|永泰永康路致和街一巷之三号(永泰小学旁)|

|燕岭路89号燕侨大厦407室翰墨教育|

|广东财经大学华商学院-华商路1号|

|蓬馨园西二栋203|

|障岗村广东青年职业职业学院|

|新兴街教育局对面梦韵床上用品专卖店|

|大园街十一巷九号一楼|

|玉亭镇百湖凤凰溪35号|

+--------------------+

only showing top 10 rows

至此,每一条地址信息都拆分成了单独的一条记录。

参考文献

explode()

http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions$@explode(e:org.apache.spark.sql.Column):org.apache.spark.sql.Column

spark中读取json_【Spark】使用DataFrame读取复杂JSON中的嵌套数组相关推荐

  1. python使用pandas中的to_json函数将dataframe数据写入json文件中

    python使用pandas中的to_json函数将dataframe数据写入json文件中 目录 python使用pandas中的to_json函数将dataframe数据写入json文件中 #导入 ...

  2. dataframe存到mysql中_pandas实现to_sql将DataFrame保存到数据库中

    目的 在数据分析时,我们有中间结果,或者最终的结果,需要保存到数据库中:或者我们有一个中间的结果,如果放到数据库中通过sql操作会更加的直观,处理后再将结果读取到DataFrame中.这两个场景,就需 ...

  3. python逐行读取json_如何用python读取json文件里指定的数据

    JSON文件who.json内容如下:{"name":"mss","version":"1.0.0","des ...

  4. python读取xlsx文件pandas_pandas dataframe 读取 xlsx 文件

    refer to: dframe = pd.read_excel("file_name.xlsx") dframe = pd.read_excel("file_name. ...

  5. rapidjson 嵌套json_[整理][RapidJson用法2]C++之RapidJson创建嵌套数组json | 勤奋的小青蛙...

    上篇博文里我通过RapidJson解析了嵌套的json文本,那么本文章是RapidJson创建嵌套数组Json文本. 代码: #include "rapidjson/document.h&q ...

  6. rapidjson 嵌套json_[整理][RapidJson用法1]C++之RapidJson解析嵌套数组json | 勤奋的小青蛙...

    因为工作需要,需要对一段嵌套的json进行解析.其中我使用的开发语言是C++. 由于rapidjson的解析效率高效,所以今天研究了下RapidJson,下面是一段我用RapidJson解析的一段具有 ...

  7. 处理json中影响解析的多余引号

    在xml中,敏感字符是尖括号,在json中,敏感字符是引号,上文中我们介绍了如何处理xml中的敏感字符,本文说说如何处理json中的敏感字符. 思路与上文相同,不再赘述.直接上代码: json–> ...

  8. 微擎写Android接口json,【微擎教程】getLocation需要在app.json中声明permission字段

    个别需要获取用户地理位置的在开发者工具调试时会出现 getLocation需要在app.json中声明permission字段   提示,如下图 说明 获取用户位置信息时需填写用途说明 在一些小程序/ ...

  9. 小程序getLocation需要在app.json中声明permission字段

    小程序getLocation需要在app.json中声明permission字段 个别需要获取用户地理位置的在开发者工具调试时会出现 getLocation需要在app.json中声明permissi ...

  10. easyui-combobox加载json中对象的属性

    这次做项目遇到了一个问题,在easyui-combobox加载json数据中对象的属性.后台返回的json中包含一个对象,而我想调用对象中的属性,后台返回的json如下: {"rows&qu ...

最新文章

  1. SpringMVC之访问静态文件
  2. 【Linux】一步一步学Linux——w命令(227)
  3. [js高手之路] vue系列教程 - vue的事件绑定与方法(2)
  4. 宝塔面板的ftp无法使用解决
  5. 骑行GPS导航套件:多普达D600+夏新GPS-166+灵图天行者9配合,伴我骑行千里
  6. Oracle 数据文件迁移过程中 执行 shartup mount 报ORA03113:通讯通道的文件结尾 问题解决过程
  7. strcmp函数原型 C语言
  8. 国家计算机二级在线报名,23 日起,全国计算机等级考试开始网上报名
  9. prince和学生们侃侃而谈系列03
  10. sis最新ip地址2020_2020秋招经验分享
  11. java 校验银行卡号_Java之——基于Luhn算法的银行卡卡号的格式校验
  12. 计算机解译地学应用效果,2014年中国地质大学(武汉)0816测绘科学与技术考研大纲...
  13. quartz动态任务调度实现
  14. 91sp.vido.ws index.php_Vidows
  15. hibernate Criteria setProjection
  16. 华擎主板bios设置图解_主板BIOS界面解析_华擎 Z170 极限玩家 7+_主板-中关村在线...
  17. Android Gradle是什么?
  18. 各种进制之间的转换方法
  19. mysql 一 、关系模型——主键——外键——索引
  20. 世界上最快的排序算法——Timsort

热门文章

  1. Android5.0视频录制--MediaProjection
  2. 能笑抽的39个奇葩代码注释
  3. SAP ABAP 计划订单转采购申请 MD14
  4. IBC2018阵容一流的主旨演讲嘉宾名单公布,同时宣布推出Global Gamechangers舞台
  5. C#对TXT文件内容进行增删改操作
  6. VBA将ppt保存为html,把某页PPT保存成一个演示文稿的VBA代码
  7. html取代frame框架,替代iframe的最好方法 什么东西可以替代iframe
  8. 改变千万人生的一堂课(第四篇 职业精神)
  9. ssh登录linux
  10. Studio One5数字音乐制作工具