一、Spark SQL簡介 Spark SQL是Spark用來處理結構化數據的一個模塊,它提供了一個編程抽象叫做DataFrame並且作為分散式SQL查詢引擎的作用。 為什麼要學習Spark SQL?我們已經學習了Hive,它是將Hive SQL轉換成MapReduce然後提交到集群上執行,大大簡化 ...
一、Spark SQL簡介
Spark SQL是Spark用來處理結構化數據的一個模塊,它提供了一個編程抽象叫做DataFrame並且作為分散式SQL查詢引擎的作用。
為什麼要學習Spark SQL?我們已經學習了Hive,它是將Hive SQL轉換成MapReduce然後提交到集群上執行,大大簡化了編寫MapReduce的程式的複雜性,由於MapReduce這種計算模型執行效率比較慢。所以Spark SQL的應運而生,它是將Spark SQL轉換成RDD,然後提交到集群執行,執行效率非常快!同時Spark SQL也支持從Hive中讀取數據。
二、Spark SQL的特點
- 無縫集成在Spark中,將SQL查詢與Spark程式混合。Spark SQL允許您使用SQL或熟悉的DataFrame API在Spark程式中查詢結構化數據。適用於Java、Scala、Python和R語言。
- 提供統一的數據訪問,以相同的方式連接到任何數據源。DataFrames和SQL提供了一種訪問各種數據源的通用方法,包括Hive、Avro、Parquet、ORC、JSON和JDBC。您甚至可以通過這些源連接數據。
- 支持Hive集成。在現有倉庫上運行SQL或HiveQL查詢。Spark SQL支持HiveQL語法以及Hive SerDes和udf,允許您訪問現有的Hive倉庫。
- 支持標準的連接,通過JDBC或ODBC連接。伺服器模式為業務智能工具提供了行業標準JDBC和ODBC連接。
三、核心概念:DataFrames和Datasets
-
DataFrame
DataFrame是組織成命名列的數據集。它在概念上等同於關係資料庫中的表,但在底層具有更豐富的優化。DataFrames可以從各種來源構建,例如:
- 結構化數據文件
- hive中的表
- 外部資料庫或現有RDDs
DataFrame API支持的語言有Scala,Java,Python和R。
從上圖可以看出,DataFrame多了數據的結構信息,即schema。RDD是分散式的 Java對象的集合。DataFrame是分散式的Row對象的集合。DataFrame除了提供了比RDD更豐富的運算元以外,更重要的特點是提升執行效率、減少數據讀取以及執行計劃的優化。
-
Datasets
Dataset是數據的分散式集合。Dataset是在Spark 1.6中添加的一個新介面,是DataFrame之上更高一級的抽象。它提供了RDD的優點(強類型化,使用強大的lambda函數的能力)以及Spark SQL優化後的執行引擎的優點。一個Dataset 可以從JVM對象構造,然後使用函數轉換(map, flatMap,filter等)去操作。 Dataset API 支持Scala和Java。 Python不支持Dataset API。
四、創建DataFrames
- 測試數據如下:員工表
- 定義case class(相當於表的結構:Schema)
case class Emp(empno:Int,ename:String,job:String,mgr:Int,hiredate:String,sal:Int,comm:Int,deptno:Int)
- 將HDFS上的數據讀入RDD,並將RDD與case Class關聯
val lines = sc.textFile("hdfs://bigdata111:9000/input/emp.csv").map(_.split(","))
- 把每個Array映射成一個Emp的對象
val emp = lines.map(x => Emp(x(0).toInt,x(1),x(2),x(3).toInt,x(4),x(5).toInt,x(6).toInt,x(7).toInt))
- 生成DataFrame
val allEmpDF = emp.toDF
- 通過DataFrames查詢數據
- 將DataFrame註冊成表(視圖)
allEmpDF.createOrReplaceTempView("emp")
- 執行SQL查詢
spark.sql("select * from emp").show