spark-sql入門(一)通過spark-shell命令行操作

  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 

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章