关于SparkSQL那些事(一)

SparkSQL概述

Spark为数据化出力引入了一个称为SparkSql的编程模块。它提供了DataFrame的编程抽象,并且可以充当分布式SQL查询引擎。

SparkSQL的前身是Shark。它是伯克利实验室Spark生态环境的组件之一,它基于hive做了一些改进,比如引入焕春管理,改进和优化执行器等,并使之能够运行在spark引擎上,虽然使得sql的查询速度得到大幅度提升,但是它对于hive有太多的依赖,制约了Spark的One Stack 入了 them all 的既定方针,以及spark各个组件的相互集成,所以提出了sparksql的项目。

sparkSQL抛弃原有的shark代码,但汲取了shark的一些优点,如内存列存储、hive兼容性等重新开发了sparksql代码。由于摆脱了hive的依赖性,sparkSql在数据兼容、性能优化、组件扩展方面得到了极大的提升。

Spark特点

1)引入了新的RDD类型SchemaRDD,可以向传统的数据库定义表一样定义SchemaRDD;

2)在应用程序中可以混合不同来源的数据,也就是说可以读取不同的数据源;

3)内嵌Catalyst查询优化框架,再把SQL解析成逻辑执行计划之后变成对应的RDD计算

 

入门

概述

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

创建DataFrame对象

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

创建方式:

RDD.toDF("列名")

举个例子:

创建好的DataFrame可以通过show方法进行查看,默认情况下只显示20条数据。

通过printScema方法可以查看列的类型等属性。

           创建多列DataFrame对象

                

由外部文件构建RDD对象

 

          1)txt文件

             txt文件不能直接转换而成,必须先利用RDD转换为tuple,然后在由toDF()转换为DataFRame

             现在读取/home/software/test.txt文件

       >val rdd = sc.textFile("/home/software/test.txt").map( x => (x,1) ).reduceByKey( (x,y) => x+y )

       >val tabx=rdd.toDF("word","count")

       >tabx.show

     

     2)读取json文件

                    这里我们读取/home/software/people.json文件。

                  

                    在读取json文件时,我们需要导包,并且创建SQLContext对象读取json文件。

    3)读取parquet文件

                  特别提一句,Parquet数据格式是一种列式存储格式,可以被多种查询引擎支持,并且与平台无关。parquet文件是以二进制方式存储的,是不可以直接读取和修改。Parquet文件是自解析的,文件中包括文件数据和文件的元数据。

                 我们读取文件/home/software/users.parquet文件。

                 >import  org.apache.spark.sql.SQLContext

                 >val ssc=new SQLContext(sc)

                 >val tb5=ssc.read.parquet("/home/software/users.parquet")

                 > tb5.show

                

              4)jdbc读取

                       具体的实现步骤:

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

                         2)重新启动spark服务

                         3)进入到spark客户端

                         4)执行代码:

                           >import  org.apache.spark.sql.SQLContext

                           >val ssc=new SQLContext(sc)

                           >val prop = new java.util.Properties

                           >prop.put("user","root")//设置用户名

                           >prop.put("password","root")//设置密码

                           >val tabx=ssc.read.jdbc("jdbc:mysql://hadoop01:3306/test","tabx",prop)//设置需要读取的数据库以及表

                           >tabx.show

                           执行结果:

                          

                        如果在运行过程中出现权限不足的 问题,则进入mysql:执行

                         grant all privileges on *.* to 'root'@'IP地址或主机名' identified by 'root' with grant option;

                         flush privileges;

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VogtZhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值