Spark SQL

Spark SQL解决了什么问题

这个之前,先说下Hive,Hive有自己的语言Hive SQL(HQL),利用sql语句查询,然后走的是MapReduce程序,提交到集群上运行.这样的话有个很大的优势,那就是它相比MapReduce节省了很多的代码,很多..

但是也有个致命的缺陷,那就是MapReduce.(后面我想写一篇MapReduce从仰望到失望,从失望到绝望...)  前面也说过,MR相比Spark的RDD,性能速度正如官方所说的,有百倍之差..  既然Spark这么强,那为何不出一个Spark SQL直接对应Hive呢,底层走的是Spark呢?  于是就有了Spark SQL.它将Spark SQL转换成RDD,然后提交到集群执行,执行效率也是MR和spark的差距。

Spark sql宏观了解

Spark sql是Spark的一个组件,Spark sql自己也有两个组件:DataFrame / DataSet.

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用.

从上图可以看出,SparkSQL可以看做是一个转换层,向下对接各种不同的结构化数据源,向上提供不同的数据访问方式。

DataFrame / DataSet / RDD的关系

之前我们讲,RDD是Spark的基石,因为其他的spark框架都是运行在Spark core上的.但是在我们Spark sql里面,就有点区别了.

在Spark sql中,DataSet是核心,没有之一.但是DataSet仅限于Spark sql中,不能在其他框架中使用,所以RDD依旧还是spark的基石,依旧是核心.而DataFrame已经被DataSet替换了,DataFrame能实现的功能,DataSet都能实现,相反,DataFrame却不能.

三者的关系如下:

RDD + schema(数据的结构信息) = DataFrame = DataSet[Row]

RDD 0.x版本发布,  DataFrame1.3版本发布, DataSet1.6版本发布.

RDD: 提供了很多实用简单的API, www.jianshu.com/p/a3a64f51ddf4 ,这是我之前写的RDD的

DataFrame: DataFrame可以理解为一个传统数据库的二维表格,除了数据以外,还记录着数据的结构信息,即schema.DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好

DataSet: DataSet[Row] = Dataframe ;  它是Dataframe API的一个扩展,是spark最新的数据抽象,也是Spark SQL中最核心的组件,它基本代替了Dataframe,也有完全代替Dataframe的趋势.

注: RDD不支持spark sql的操作

RDD / DataSet / Dataframe之间的转换

上面说到RDD不支持Spark sql的操作,但是Spark生态圈只提供了Spark core一个计算框架,且Spark生态圈都是基于Spark core进行计算的,所以Spark core对接Spark sql的方式就是:将RDD转换为DataSet  /  Dataframe,且三者之间支持互相转换!

转换之前先聊一下DataFrame支持两种查询方式:一种是DSL风格,另外一种是SQL风格,dataFrame支持两者查询风格

DSL: 你需要引入  import spark.implicit._  这个隐式转换,可以将DataFrame隐式转换成RDD。

SQL: 你需要将DataFrame注册成一张表格,且需要通过sparkSession.sql 方法来运行你的SQL语句

用Spark-shell来操作Spark SQL,spark作为SparkSession的变量名,sc作为SparkContext的变量名.

将文件中的数据转换成DataSet                                                                                                            //先case一个类                                                                                                                              case class person(name:String,age:Int)                                                                                              //将文件里面的数据转换成DataSet                                                                                                    val peopleDF2 =spark.sparkContext.textFile("../examples/src/main/resources/people.txt").map(_.split(",")).map(para=> Person(para(0).trim,para(1).trim.toInt)).toDF                    //制成一张person的表                                                                                                                          peopleDF2.createOrReplaceTempView("persons")                                                                            //查询                                                                                                                                                val teen =spark.sql("select * from persons where age between 13 and 30")                                      //因为DataFrame=DataSet[row],所以要访问row对象中的每一个元素,可以通过这种row[0]角标的方式来访问,上面是通过反射获取schema                                                                                      teen.map(row => "name:" + row(0)).show

//将RDD转换成DataFrame                                                                                                                var peopleRDD = sc.textFile("../examples/src/main/resources/people.txt")                        peopleRDD.collect                                                                                                                              //以”,”切割,得到一个Array,然后再用map对里面的每一个元素都进行转换,最后用toDF方法给这两个起名字                                                                                                                                              val peopleDF =peopleRDD.map(_.split(",")).map(para=>(para(0).trim(),para(1).trim().toInt)).toDF("name","age")

//将 DataFrame转换成RDD                                                                                                             val aa = peopleDF.rdd            //对,没错,就是一行!一个方法搞定                     

//将RDD转换成DataSet                                                                                                                  case class person(name:String,age:Int)                                                                                              //先定义一个case实例,最后是直接toDS就ok了                                                                                val peopleDF= peopleRDD.map(_.split(",")).map(para=>person(para(0).trim(),para(1).trim().toInt)).toDS

//将DataSet转换成RDD                                                                                                                    val bb = peopleDF.rdd        //和上面一样,一个方法搞定

//将DataFrame转换成DataSet                                                                                        peopleDF.as[person]           as那个case的类

将DataSet转换成DataFrame                                                                                               PeopleDS.toDF                   用的toDF方法

Spark SQL链接Hive

Spark SQL和Hive的连接有两种,一种是Spark内置的Hive,一种是Spark连接外部的Hive.

内置Hive: 内置Hive和Spark会完美地兼容,但是我用的都是外置的Hive

外置Hive: 这是Spark连接Hive的主要模式; 实现方式:

1. 需要将hive-site.xml 拷贝到spark的conf目录下。

2. 如果hive的metestore使用的是mysql数据库,那么需要将mysql的jdbc驱动包放到spark的jars目录下。

3. 用bin/spark-shell打开时候,第一次需要在后面加--confspark.sql.warehouse.dir=hdfs:hadoop101:9000/spark_warehouse

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容