Spark SQL简介及视频教程(2)

OLAP    OnLine Analaysier Processor  在线联机分析处理系统(比如Hive  Hbase等)

2)很多列式数据库还支持列族(column group,Bigtable系统中称为locality group),即将多个经常一起访问的数据列的各个值存放在一起。如果读取的数据列属于相同的列族,列式数据库可以从相同的地方一次性读取多个数据列的值,避免了多个数据列的合并。列族是一种行列混合存储模式,这种模式能够同时满足OLTP和OLAP的查询需求。

3)此外,由于同一个数据列的数据重复度很高,因此,列式数据库压缩时有很大的优势。

例如,Google Bigtable列式数据库对网页库压缩可以达到15倍以上的压缩率。另外,可以针对列式存储做专门的索引优化。比如,性别列只有两个值,“男”和“女”,可以对这一列建立位图索引:

如下图所示

“男”对应的位图为100101,表示第1、4、6行值为“男”

“女”对应的位图为011010,表示第2、3、5行值为“女”

如果需要查找男性或者女性的个数,只需要统计相应的位图中1出现的次数即可。另外,建立位图索引后0和1的重复度高,可以采用专门的编码方式对其进行压缩。

当然,如果每次查询涉及的数据量较小或者大部分查询都需要整行的数据,列式数据库并不适用。

5、总结


1.行存储特性

传统行式数据库的特性如下:

①数据是按行存储的。

②没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。

③建立索引和物化视图需要花费大量的时间和资源。

④面对查询需求,数据库必须被大量膨胀才能满足需求。

2.列存储特性

列式数据库的特性如下:

①数据按列存储,即每一列单独存放。

②数据即索引。

③只访问查询涉及的列,可以大量降低系统I/O。

④每一列由一个线程来处理,即查询的并发处理性能高。

⑤数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。

三、SparkSQL入门

================

SparkSql将RDD封装成一个DataFrame对象,这个对象类似于关系型数据库中的表。

1、创建DataFrame对象


DataFrame就相当于数据库的一张表。它是个只读的表,不能在运算过程再往里加元素。

RDD.toDF(“列名”)

scala> val rdd = sc.parallelize(List(1,2,3,4,5,6))

rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at :21

scala> rdd.toDF(“id”)

res0: org.apache.spark.sql.DataFrame = [id: int]

scala> res0.show#默认只显示20条数据

±–+

| id|

±–+

| 1|

| 2|

| 3|

| 4|

| 5|

| 6|

±–+

scala> res0.printSchema #查看列的类型等属性

root

|-- id: integer (nullable = true)

创建多列DataFrame对象

DataFrame就相当于数据库的一张表。

scala> sc.parallelize(List( (1,“beijing”),(2,“shanghai”) ) )

res3: org.apache.spark.rdd.RDD[(Int, String)] = ParallelCollectionRDD[5] at parallelize at :22

scala> res3.toDF(“id”,“name”)

res4: org.apache.spark.sql.DataFrame = [id: int, name: string]

scala> res4.show

±–±-------+

| id| name|

±–±-------+

| 1| beijing|

| 2|shanghai|

±–±-------+

例如3列的

scala> sc.parallelize(List( (1,“beijing”,100780),(2,“shanghai”,560090),(3,“xi’an”,600329)))

res6: org.apache.spark.rdd.RDD[(Int, String, Int)] = ParallelCollectionRDD[10] at parallelize at :22

scala> res6.toDF(“id”,“name”,“postcode”)

res7: org.apache.spark.sql.DataFrame = [id: int, name: string, postcode: int]

scala> res7.show

±–±-------±-------+

| id| name|postcode|

±–±-------±-------+

| 1| beijing| 100780|

| 2|shanghai| 560090|

| 3| xi’an| 600329|

±–±-------±-------+

可以看出,需要构建几列,tuple就有几个内容。

2、由外部文件构造DataFrame对象


1.读取txt文件

txt文件不能直接转换成,先利用RDD转换为tuple。然后toDF()转换为DataFrame。

scala> val rdd = sc.textFile(“/root/words.txt”)

.map( x => (x,1) )

.reduceByKey( (x,y) => x+y )

rdd: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[18] at reduceByKey at :21

scala> rdd.toDF(“word”,“count”)

res9: org.apache.spark.sql.DataFrame = [word: string, count: int]

scala> res9.show

±-----±----+

| word|count|

±-----±----+

| spark| 3|

| hive| 1|

|hadoop| 2|

| big| 2|

| scla| 1|

| data| 1|

±-----±----+

2.读取json文件

文件代码:

{“id”:1, “name”:“leo”, “age”:18}

{“id”:2, “name”:“jack”, “age”:19}

{“id”:3, “name”:“marry”, “age”:17}

实现:

import org.apache.spark.sql.SQLContext

scala>val sqc=new SQLContext(sc)

scala> val tb4=sqc.read.json(“/home/software/people.json”)

scala> tb4.show

3.读取parquet文件

格式如下:

1>Parquet数据格式

Parquet是一种列式存储格式,可以被多种查询引擎支持(Hive、Impala、Drill等),并且它是语言和平台无关的。

Parquet文件下载后是否可以直接读取和修改呢?

Parquet文件是以二进制方式存储的,是不可以直接读取和修改的。Parquet文件是自解析的,文件中包括该文件的数据和元数据。

列式存储和行式存储相比有哪些优势呢?

可以只读取需要的数据,降低IO数据量;

压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码进一步节约存储空间。

参考链接:

http://blog.csdn.net/yu616568/article/details/51868447 讲解了parquet文件格式

http://www.infoq.com/cn/articles/in-depth-analysis-of-parquet-column-storage-format 讲解了parquet列式存储。

实现:

scala>val tb5=sqc.read.parquet(“/home/software/users.parquet”)

scala> tb5.show

4.jdbc读取

实现步骤:

1)将mysql 的驱动jar上传到spark的jars目录下

2)重启spark服务

3)进入spark客户端

4)执行代码,比如在Mysql数据库下,有一个test库,在test库下有一张表为tabx

执行代码:

import org.apache.spark.sql.SQLContext

scala> val sqc = new SQLContext(sc);

scala> val prop = new java.util.Properties

scala> prop.put(“user”,“root”)

scala> prop.put(“password”,“root”)

scala>val tabx=sqc.read.jdbc(“jdbc:mysql://hadoop01:3306/test”,“tabx”,prop)

最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~

给大家准备的学习资料包括但不限于:

Python 环境、pycharm编辑器/永久激活/翻译插件

python 零基础视频教程

Python 界面开发实战教程

Python 爬虫实战教程

Python 数据分析实战教程

python 游戏开发实战教程

Python 电子书100本

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值