Spark SQL编程实战案例html
做者:尹正杰sql
版权声明:原创做品,谢绝转载!不然将追究法律责任。apache
一.Spark SQL编程之DataFrame篇编程
博主推荐阅读: https://www.cnblogs.com/yinzhengjie2020/p/13193293.html
二.Spark SQL编程之DataSet篇json
博主推荐阅读: 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 ~]#
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