SparkSQL是spark用來處理結構化的一個模塊,它提供一個抽象的數據集DataFrame,並且是作爲分佈式SQL查詢引擎的應用
注:本文所有操作是基於ambari工具,搭建好了 hdfs yarn hive spark mapReduce 等大數據常用的組件
一、進入spark命令窗口
輸入命令 spark-shell
以上是各種報錯的部分截圖,原因是spark操文件時,用的是hdfs系統,使用hdfs系統必須hdfs賬號來操作,
爲了解決上述問題,切換用戶到hdfs用戶即可
退出重新進入
切換hdfs用戶
su hdfs
重新進入spark-shell
spark-shell
現在完全正常了,
二、創建DataFrames
2.1、創建了一個數據集,實現了並行化
val seq= Seq(("1","xiaoming",15),("2","xiaohong",20),("3","xiaobi",10))
var rdd1 = sc.parallelize(seq)
2.2、將當前的rdd對象轉換爲DataFrame對象(數據信息和數據結構信息存儲到DataFrame)
val df = rdd1.toDF("id","name","age")
三、查詢數據操作
3.1、DSL 風格語法
df.select("name").show
df.select("name","age").show
//條件過濾
df.select("name","age").filter("age >10").show
//參數必須是一個字符串,filter中的表達式也需要時一個字符串
3.1.1、參數是類名col (“列名”)
df.select(“name”,“age”).filter(col(“age”) >10).show
3.1.2、分組統計個數
df.groupBy("age").count().show()
3.1.3、打印DataFrame結構信息
df.printSchema
3.2、SQL風格語法
DataFrame的一個強大之處就是我們可以將它看作是一個關係型數據表,然後可以通過在程序中使用spark.sql() 來執行SQL查詢,結果將作爲一個DataFrame返回。
如果想使用SQL風格的語法,需要將DataFrame註冊成表,註冊方式如下
df.registerTempTable("t_person")
表示 將DataFrame成t_person表
3.2.1 、查詢年齡最大的前兩名
spark.sql("select * from t_person order by age desc limit 2").show
3.2.2、顯示錶的Schema信息
spark.sql("desc t_person").show
3.2.3 、查詢年齡大於30的人的信息
spark.sql("select * from t_person where age > 10 ").show
3.3、DataSet 風格
3.3.1. 、 什麼是DataSet
DataSet是分佈式的數據集合。DataSet是在Spark1.6中添加的新的接口。它集中了RDD的優點(強類型和可以用強大lambda函數)以及Spark SQL優化的執行引擎。DataSet可以通過JVM的對象進行構建,可以用函數式的轉換(map/flatmap/filter)進行多種操作
3.3.2 、 DataFrame、DataSet、RDD的區別
同樣一組數據,分別形式如下
RDD中的長像:
DataFrame中的長像
Dataset中的長像
DataSet包含了DataFrame的功能,Spark2.0中兩者統一,DataFrame表示爲DataSet[Row],即DataSet的子集。
(1)DataSet可以在編譯時檢查類型
(2)並且是面向對象的編程接口
相比DataFrame,Dataset提供了編譯時類型檢查,對於分佈式程序來講,提交一次作業太費勁了(要編譯、打包、上傳、運行),到提交到集羣運行時才發現錯誤,這會浪費大量的時間,這也是引入Dataset的一個重要原因。
3.3.3 DataFrame與DataSet的互轉
DataFrame和DataSet可以相互轉化。
(1)DataFrame轉爲 DataSet
df.as[ElementType]這樣可以把DataFrame轉化爲DataSet。
(2)DataSet轉爲DataFrame
ds.toDF()這樣可以把DataSet轉化爲DataFrame。
3.3.4. 創建DataSet
3.3.4.1 、通過spark.createDataset創建
val ds = spark.createDataset(1 to 10)
3.3.4.2、通toDS方法生成DataSet
定義一個類
case class Person(name:String,age:Long)
定義一個類的集合
val data = List(Person("zhangsan",20),Person("lisi",30))
轉成DS
val ds = data.toDS
查看DS
ds.show