Spark SQL编程实战案例

             Spark SQL编程实战案例html

                                     做者:尹正杰sql

版权声明:原创做品,谢绝转载!不然将追究法律责任。apache

 

 

 

一.Spark SQL编程之DataFrame篇编程

  博主推荐阅读:
    https://www.cnblogs.com/yinzhengjie2020/p/13193293.html

 

二.Spark SQL编程之DataSetjson

  博主推荐阅读:
    https://www.cnblogs.com/yinzhengjie2020/p/13197064.html

 

三.DataFrame与DataSet的互操做vim

[root@hadoop101.yinzhengjie.org.cn ~]# vim /tmp/user.json
[root@hadoop101.yinzhengjie.org.cn ~]# 
[root@hadoop101.yinzhengjie.org.cn ~]# cat /tmp/user.json
{"name":"yinzhengjie","passwd":"2020"}
{"name":"Jason","passwd":"666666"}
{"name":"Liming","passwd":"123"}
{"name":"Jenny","passwd":"456"}
{"name":"Danny","passwd":"789"}
[root@hadoop101.yinzhengjie.org.cn ~]# 
[root@hadoop101.yinzhengjie.org.cn ~]# vim /tmp/user.json        #建立测试数据
scala> import spark.implicits._                        #舒适提示,在执行下面的案例操做前,须要先导入隐式转换哟~
import spark.implicits._

scala> 

1>.DataFrame转换为DataSet缓存

scala> val df = spark.read.json("/tmp/user.json")            #建立DataFrame
df: org.apache.spark.sql.DataFrame = [name: string, passwd: string]

scala> case class User(name: String, passwd: String)          #建立样例类
defined class User

scala> val ds = df.as[User]                        #经过样例类将DataFrame转换为DataSet
ds: org.apache.spark.sql.Dataset[User] = [name: string, passwd: string]

scala> ds.show
+-----------+------+
|       name|passwd|
+-----------+------+
|yinzhengjie|  2020|
|      Jason|666666|
|     Liming|   123|
|      Jenny|   456|
|      Danny|   789|
+-----------+------+


scala> 

2>.DataSet转换为DataFrame数据结构

scala> ds                #当前DataSet是上一个案例的对象
res11: org.apache.spark.sql.Dataset[User] = [name: string, passwd: string]

scala> val df = ds.toDF        #将DataSet转换为DataFrame
df: org.apache.spark.sql.DataFrame = [name: string, passwd: string]

scala> df.show
+-----------+------+
|       name|passwd|
+-----------+------+
|yinzhengjie|  2020|
|      Jason|666666|
|     Liming|   123|
|      Jenny|   456|
|      Danny|   789|
+-----------+------+


scala> 

 

四.RDD,DataFrame和DataSet三者之间的关系分布式

  在SparkSQL中Spark为咱们提供了两个新的抽象,分别是DataFrame和DataSet。他们和RDD有什么区别呢?首先从版本的产生上来看:
    RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6)

  若是一样的数据都给到这三个数据结构,他们分别计算以后,都会给出相同的结果。不一样是的他们的执行效率和执行方式。
  在后期的Spark版本中,DataSet会逐步取代RDD和DataFrame成为惟一的API接口。

1>.共性ide

  RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利

  三者都有惰性机制,在进行建立、转换,如map方法时,不会当即执行,只有在遇到Action如foreach时,三者才会开始遍历运算。
  
三者都会根据spark的内存状况自动缓存运算,这样即便数据量很大,也不用担忧会内存溢出。
  
三者都有partition的概念
  
三者有许多共同的函数,如filter,排序等
  
在对DataFrame和Dataset进行操做许多操做都须要导入隐式转换(import spark.implicits._)进行支持

  DataFrame和Dataset都可使用模式匹配获取各个字段的值和类型

2>.区别

  RDD:
    RDD通常和spark mlib同时使用
    RDD不支持sparksql操做

  DataFrame:
    与RDD和Dataset不一样,DataFrame每一行的类型固定为Row,每一列的值无法直接访问,只有经过解析才能获取各个字段的值
    DataFrame与Dataset通常不与spark mlib同时使用
    DataFrame与Dataset均支持sparksql的操做,好比select,groupby之类,还能注册临时表/视窗,进行sql语句操做
    DataFrame与Dataset支持一些特别方便的保存方式,好比保存成csv,能够带上表头,这样每一列的字段名一目了然.利用这样的保存方式,能够方便的得到字段名和列的对应,并且分隔符(delimiter)能够自由指定。

  Dataset:
    Dataset和DataFrame拥有彻底相同的成员函数,区别只是每一行的数据类型不一样。
    DataFrame也能够叫Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用上面提到的getAS方法或者共性中的第七条提到的模式匹配拿出特定字段。而Dataset中,每一行是什么类型是不必定的,在自定义了case class以后能够很自由的得到每一行的信息
    Dataset在须要访问列中的某个字段时是很是方便的,然而,若是要写一些适配性很强的函数时,若是使用Dataset,行的类型又不肯定,多是各类case class,没法实现适配,这时候用DataFrame即Dataset[Row]就能比较好的解决问题。

 

五.IDEA建立SparkSQL程序

  博主推荐阅读:
    https://www.cnblogs.com/yinzhengjie2020/p/13200300.html
相关文章
相关标签/搜索