开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:SparkSQL 读写_Parquet】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12054
SparkSQL 读写_Parquet
内容介绍:
一、Spark 在什么时候使用
二、spark 如何使用
怎么使用 reader 从 Parquet 文件当中读出数据,怎么将数据通过 water 写入的文件当中,这是这一小节的两大目的。
本节两个知识点,第一个知识点,spark 在什么时候使用,这是第一点,第二点,要去说一说如何使用 spark。
一、spark 在什么时候使用
Parquet 格式在什么时候会使用。首先,Parquet 是支持压缩,其次,Parquet 的读取和写入的速度是非常高的,Parquet 是一种特别合适的这种文件格式,特别是在大数据处理的场景当中,其实是比较常见的。
经常会遇到这种 Parquet 的格式,Parquet 其实最早也是源自于谷歌,后来被世界所实现为一个文件格式。
一般情况下,就是最快的数据,数据要处理的数据是从业务系统获取到的,比如现在要做一个电商系统的数据分析大数据平台,的数据来自哪儿?来自于的那个电商系统。
电商系统,就称之为叫做业务系统,要交给后面的,比如说 half 来进行处理,half 来进行查询,或者要使用什么 K 来进行多维分析,呢要先把数据给抽到的 HDFS 上,这是 Parquet 的第一个应用场景,也就是说数据抽取的,数据抽取的,放入 HDFS 中的可能会使用什么格式?
一般是按公司为单位的,我们公司,倾向于用 RC,我们公司可能所有人都在用 RC,我公司倾向于用 sequence,可能我们整个公司都在用,数据格式一般是和公司有关系的,一般是公司的决定,再接下来还有一个场景,就是 ETL1,为什么要单独给他写为一个单元,是因为 ETL 当中的 X 的工具实在是太多了,列举几个就到现在为止,已经学过好几个,比如说 group,他也是抽取的,无论是从 Mexico 抽,还是从任何地方抽,工具有很多,包括开头之类的工具,也可以做一点。
如果是这样的话,数据抽取,要单独来去说,但是还有一个场景,就是数据抽取的工具,把文件放到 HDFS 以后,Spark 有可能要去读取文件来进行分析和处理的,所有的分析和处理完以后,假定说,数据仓库是分层,他处理完第一层的数据是不是有可能再往 HDFS 里面放一下?这一步的放是不是也可以使用 Parquet 格式。
Spark 在处理的过程中也有可能使用 parquet 进行暂存,这是所说的两个使用场景,接下来,spark 处理过了以后,就是 ETL 当中装载过程,spark 也可以直接把数据装载进去。这是为什么要使用到 Parquet。
二、spark 如何使用
第二部分,要去写一个 Parquet 的小案例,打开 idea,打开 idea 以后,清空一下之前的,创建一个新的方法,叫做 past。
然后方法叫做 Parquet,把方法创建好了以后,案例应该怎么做呢?既要读 Parquet,也要写 Parquet,这有一个北京 PM 值的 CSV 文件,先把数据,从 CSV 文件给他读出来,第一步,读取 CSV 文件的数据。
第二步,把数据,把数据写为 Parquet 格式,再使用 spark 去读 Parquet。读有,写有,这就是一个大致的步骤了。
做第一步,要去读取 CSV 当中的数据,怎么去读?
首先,可以直接定义出来一个 DF,使用 spark 的方法,获取到的 dataframe reader,接下来,通过 option 来去指定是有 header 的,文件里面是有 header 的,这写过很多次了,然后再接下来,CSV 去读取的文件,读取 data set 下的北京。PM 值点 CSV,DF,就读出来了。
读出来以后,可以直接把数据写微盘可以格式,white 以后,就可以使用 save 方法,在使用 save 方法之前,还应该再去为其指定一个 format,format 当中要去指定他是 Parquet,然后 save 到的 dataset。
Dataset 下的也叫做北京,PM 称谓叫做三,这样的一段代码就写完了,可以运行一下。
整个代码已经运行完成了,发现在位置是不是已经创建出来这样的一个北京 PM3 这样的一个文件夹,其实,以往虽然知道 save 会把它 save 成一个文件夹,但是,还是会去写上.PK,所以,这点大家要注意,当然地方就先暂时去掉,,简单说一个小问题,假如说我现在再去运行一下,会出现什么问题?
运行一下,运行完成以后,发现地方报错了,analysis exception 说 pass,然后 already exist 说明就是它已经存在了,只要文件存在了,就不能再去挖文件里面写内容吗?这明显是不合理的,怎么解决呢?
可以先把代码稍微改一下,waiter 当中,其实有一个非常重要的一个属性叫做 Mode,当时也写了,也说了他叫做存取的模式,存入的模式,写入模式,可以从 save mode 这样的一个类当中来进行调用,比如说,mode 当中接收一个存取模式,一个写入模式,默认情况下它应该是什么呢?
可以点击默认方法看一眼,应该是 default option,Error exists,也就是说里面只要有文件,就报一个错。
接下来可以指定为叫做 over,right 是当文件里面已经有内容的重写这份内容。这是的 over right.
看一下文件大概有多大,文件是一个 snoopy 的这样的一个格式,一个 CRC 一个是 snap perky,看球就可以,点击右键,然后 show in explorer,然后看一下整个文件夹
把北京 PM3 文件夹的大小大概是 646 KB,通过 over write 来去运行一下,来看一看文件的大小,变化,再次运行,已经能够看到的结果已经运行出来了,结果,肯定是一个 test past,也就是没有任何问题,已经运行完了,如果是这样的话,再去查看一下的文件夹,去看一下 PM3 的文件大小有没有发生变化,是不是没有发生太大变化,还是 640 多,为什么没有变呢?
因为现在,是把原来的数据是不是重写了一份,覆盖掉了,所以,没有任何变化,假如说,使用 Panda,就是直接向里面进行追加,运行一下,代码已经运行完了,Test passed,说明了是没有报错的,接下来,再去查看一下文件夹的大小,可以点击属性,然后找到其大小,发现基本上是原来的两倍,原来,是 16XX,现在,是 13XX,13XX,原来是 600 多,现在是 1300 多,这是之间的区别为什么变大了。
为什么变大了,因为现在,进行了一个 open 的追加,其实,还有一个叫做 ignore ,就是看不到任何效果,如果数据文件里面已经存在内容了,就什么都不做。
这是的第二个小细节,继续再向下看,还有一个小细节,就是说假如说帮把去掉,把写作模式改为 over right。
现在操作是往这里存,往北京 PM3 里存,但是,并没有指定 format 是什么,现在的写入模式,是 over write,也就是说只要他里面有数据,他就会先被删掉,然后再重新写,会覆盖掉里面的内容。
运行一下,再来看一看这种方式,写入的文件格式是什么格式?也就是说不指定 format 是什么格式?
运行已经有结果,注意,就是我使用 over write 了以后,接下来再去看一下文件夹的大小,PM3 的属性,点开看到成 600 多 K 了,文件夹是更新过了,确实写东西了,但是我并没有指定的什么 format,也就没有告诉 spark 这是一个 Parquet,Spark 是不是会使用它默认的写入格式来进行数据的写入,看一看它默认的写入格式什么?是不是还是一个 Parquet?在地方,是不是一个 Parquet 格式的文件好。
所以说,是没有问题的,就说了几件事,第一件事,写入的默认格式就是 Parquet。
然后其次,又说了一个写入模式,大致有几种,第一种什么报错,第二种是覆盖,叫做 over write,然后接下来,第三种,叫做 penda 追加,然后第四种,叫做 ignore。
这就是这一小节的内容,接下来来去试着读一读 party 格式的文件,CF 是不是可以直接使用 read 来进行读取?如果是这样的话,不是 DNF 使用 read,是 spark 使用 read 来进行读取,读取的,可以指定 format,也可以不指定 format,来看一看默认的读取格式是不是也是的 Parquet。
来去写出文件 dataset,就写上 dataset,写上北京下划线 PM3A,以往使用 mode 方法是不是去读一个文件。
但是,现在直接把文件夹塞过来,大家觉得可以进行写入成功吗?两个细节,第一个细节,默认格式是否是 party?第二个,是否能读取文件夹?两个问题,接下来来运行一下,已经读取成功了,里面的内容读出来了,所以,默认格式是的,是否能读取文件夹呢?看结果已经出来吗?所以,就是没有任何问题,得到的结论就是无论是读还是写,spark 默认的格式是 parquet。
如果是写的话,他其实默认的是把数据写到文件夹当中,如果的数据是符合这种格式的话,读的,也会把文件夹里面的数据读出来。
无需去指定具体的 parquet 格式的文件,这就是这一小节的内容。