开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:SparkSQL 读写_JSON 小技巧】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12057
SparkSQL 读写_JSON 小技巧
内容介绍:
一、toJSON 的场景
二、从 RDD 中直接读取 JSON 格式的 DateFrame
三、课堂总结
处理 JSON 格式文件的小技巧有两个,其一是通过 toJSON 可以将 DateFrame 转成 JSON 形式的 DateFrame;其二是可以直接从 RDD 读取 JSON 的 DateFrame。这两个小技巧都有其分别的适用场景,接下来就进行具体的学习。
一、toJSON 的场景
1、场景
处理完之后,DateFrame 中如果是一个对象,则要将其转化为 JSON,再将 JSON 发送给其他系统。如果其他的系统只支持 JSON 格式的数据,此时 SparkSQL 如果与各种系统进行整合的时,就必须进行转换,将 DateFrame 当中的对象转成 JSON 格式,再发送给其他系统。
2、应用
首先进入 IDEA 中,关闭其他无用的文件。
@Test
def json1(): unit = {
//创建新的方法,并将其命名为 json1
val df = spark.read
.Option("header", value = true)
.csv(path="dataset/BeijingPM20100101_20151231.csv" )
//读出一个关于北京 PM 值的数据集
df.toJSON.show ( )
//通过该数据集有一个方法 toJSON
//toJSON 的 API 应用较为强大,可以直接把 df 当中存放的对象直接转成 JSON 的字符串。正常情况下,这种转换需要使用一些外部工具才能把对象转换为 JSON,如 grows 或 fastjason 等。
}
}
运行代码,对比之前读出的北京 PM 值数据,原先数据有很多列,而现在的运行结果中仅剩一列,且 value 这一列中数据的格式是字符串。
可以发现每一条数据都转成了 JSON 字符串形式的数据。
3、补充
上文中提到仅支持 JSON 数据格式的系统,这里进行举例说明。有一些之前遇到过的不特别常见的场景,需要把数据发往消息队列,但在发之前,要先用 Spark 进行处理,若处于这种情况下,消息队列的那一段只支持 JSON 格式的数据,此时就必须先把 DateFrame 原本的对象转成 JSON 格式再发到消息队列里,就会用到 toJSON。
二、从 RDD 中直接读取 JSON 格式的 DateFrame
1、场景
有一些场景则与上面所提到的将数据发往消息队列相反,如从消息队列里取出 JSON 格式的文件数据需要使用 SparkSQL 进行处理。从消息队列里取出的是 JSON 格式的数据,则应使用 SparkSQL 把 JSON 格式的数据转成对象形式的数据,再进行处理。
2、应用
@Test
def json2(): unit = {
val df = spark.read
.Option("header", value = true)
.csv(path="dataset/BeijingPM20100101_20151231.csv" )
val jsonRDD = df.toJSON.rdd
//此时无法像读取文件一样直接读出 DateFrame,而经过 toJSON 之后则变成了一个 JSON 格式的 DateFrame。而通过 val jsonRDD = df.toJSON.rdd 又将其转换为 JSON 形式的 RDD。
spark.read.json (jsonRDD).show()
//通过 spark.read.json (jsonRDD)直接从 RDD 中读取
DateFrame,并查看结果。
}
}
运行结果显示在运行过程中又把 JSON 形式的数据转成了 DateFrame 的对象形式,且成功返回了结构信息。
这种场景偶尔也会遇到。
三、课堂总结
本节课主要介绍了两个知识点,第一个是把 Dateset[Object](对象形式)转为 Dateset[jsonString](JSON 格式),
第二个知识点是把 RDD[jsonString]转为 DateFrame,即转成 Dateset[Object]。
综上所述,本节课实际上学习了 JSON 和普通对象之间的相互转换,并通过 SparkSQL 提供了相应的支持。

