开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:SparkSQL 读写_JSON】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12056
SparkSQL 读写_JSON
内容介绍:
一、什么时候会用到 JSON
二、读写 JSON 文件
要读写 JSON 文件要先了解以下几点:第一,JSON 的应用场景;第二,JSON 格式的读写;第三,JSON 格式读写上的小技巧,本章以介绍应用场景为主。
一、什么时候会用到 JSON
JSON 用于途中的业务系统的位置,JSON 并不是一个压缩的数据格式,也不是一个列存储的数据格式,也不是一个可以高效读取的数据格式,甚至 JSON 相对而言还较为繁琐,它最重要的应用场景是在业务系统当中,包括 SpringBoot 这样的工具,这类外观工具在前后端传输的时候,大量使用 JSON,mongDB 也是基于 JSON 的,所以在业务系统中 JSON 被广泛使用。
同时在 ETL 中的 E 到 HDFS 的过程中也极有可能需要存储 JSON,同时进行读处理的时候更难免需要使用到 JSON。
在 ETL 中, Spark 经常扮演 T 的职务,也就是进行数据清洗和数据转换。
在业务系统中,JSON 是一个非常常见的数据格式,在前后端交互的时候也往往会使用 JSON ,从业务系统获取的数据很大可能性是使用 JSON 格式,所以就需要 Spark 能够支持 JSON 格式文件的读取。
二、读写 JSON 文件
将要 Dataset 保存为 JSON 格式的文件比较简单,是 DataFramewriter 的一个常规使用。
1.JSON 的存入
如何进行 JSON 文件的读写,打开 IDEA 创建一个新方法,命名为 json,方法中第一步首先读取一个数据集,设置为 json 的形式。
l 代码如下:
@Test
def json(): unit = {
val df = spark .read
option("header", value = true)
.csv( path = "dataset/BeijingPM20100101_20151231.csv")
//将其设置为 json 的形式
df.write
.json( path ="dataset/beijing_pm5.json")
将以上代码在方法体中运行,查看 json 的格式文件,运行完毕后就可以看到 json 的格式文件名为 beijing_pm5.json 成功生成,打开就可以看到数据存储在 part-00000 中存储格式为 json。
打开文件后,就可以看到以下看似是 json 格式的文件,但{}的尾部并没有逗号,同时第一个位置也没有数组的符号,所以它并不是一个标准格式的 json 文件,它本身就是一条 json。
json 的格式是以花括号开头,逗号作为分隔。同时它的花括号是遥相呼应的,开头有一个,结尾必然也有一个。而花括号中的就是就是列名和其对应的值。可以将 json 的整体看做一个对象。
属性的属性名和属性值之间用(:)分隔,多个属性用(,)逗号分隔,如其中的"year"" : "2010”,year 就是属性名,2010 就是属性值。同时如果将”2010”的冒号去掉变为 2010,就可以将其指定为 int 类型。
l 数据如下:
{
"No":""1"",//属性的属性名和属性值,之间用:分隔
"year"" : "2010,
"month" : "1",
"day" : ""1",
"hour :"e",
"season" : "4",
"PM_Dongsi":"NA",
"PM_Dongsihuan"" :"NA",
“PM_Nongzhanguan":"NA",
"PM_US_Post”:"NA",
"DEWP" :”-21"",
"HUMI":43"",
"PRES":"1021"
"TEMP"":"-11",
"cbwd" :"MN",
"Iws":"1.79",
"precipitation" :"e" , "Iprec" :"0"
)
l 总结:
json 的格式是以花括号开头,逗号用于分隔多个属性之间,同时属性的值可以有数据类型。
支持数值型,布尔型和字符串等等。JSON 的关键作用是在大数据业务中使用的十分广泛,因为大数据系统要经常和业务系统进行配合时,就需要 JSON。同时在 java 的 JSON 解析库十分齐全。以上就是 JSON 全部的存入过程。
2. JSON 的读取
l 代码如下:
@Test
def json(): unit = {
val df = spark .read
.option("header", value = true)
csv( path = "dataset/BeijingPM20100101_20151231.csv")
//将其设置为 json 的形式
//df.write
// .json( path ="dataset/beijing_pm5.json")
//直接使用 spark.read,同时设置要读取的 json 文件位置
Spark.read
.json(path = “dataset/beijing_pm5.json”)
.show()
}
运行以上代码,在控制台看到所有的数据被成功读出,就可以说明以上读取操作成功。
最后需要注意的是 json 的格式代码在编译器中的属性值默认都是字符串形式,有部分数据可能会有一些杂值,除非通过指定 schema 的形式,如果没有指定的话,在写 json 的时候会默认使用 String 的格式,同时使用 spark.read 来读取 json 文件的时候会自动发现文件当中的数据类型,如读取的一列是 String,那么读取后的结果也会是 String。
同时将数据写成 json 的形式,并非是将其写成一个单独 json 的形式,而是以下形式:
{
"No":""1"",//属性的属性名和属性值,之间用:分隔
"year"" : "2010,
"month" : "1",
"day" : ""1",
"hour :"e",
"season" : "4",
"PM_Dongsi":"NA",
"PM_Dongsihuan"" :"NA",
“PM_Nongzhanguan":"NA",
"PM_US_Post”:"NA",
"DEWP" :”-21"",
"HUMI":43"",
"PRES":"1021"
"TEMP"":"-11",
"cbwd" :"MN",
"Iws":"1.79",
"precipitation" :"e" , "Iprec" :"0"
}
这才是一条单独的 json。而图中写成的就是一个个单独的 json 的形式,它并不能够直接被 json 解析器解析出来,而是读出其中每个单独的一行,所以该模式称为 json 行文件,后缀可能叫做 jsonl。
如果不重新分区,则会为 DataFrame 底层的 RDO 的每个分区生成一个文件,为了保持只有一个输出文件,所以重新分区。
保存为 JSON 格式的文件有一个细节需要注意,这个 JSON 格式的文件中,每一行是一个独立的 JSON ,但是整个文件并不只是一个 JSON 字符串,所以这种文件格式很多时候被成为 JSON Line 文件,有时候后缀名也会变为 jsonl。
l beijing_pm.jsonl 代码:
{ "day" : "1" , "hour" : "O" , "season" : "1" , "year" : 2013, "month" : 3}{ "day" : "1" , "hour" : "1" , "season" : "1" , "year " : 2013 , "month" :3]{ "day" : "1" , "hour" : "2" , "season" : "1" , "year" :2013 , "month" : 3}