【趙強老師】什麼是Spark SQL?

1、Spark SQL簡介

Spark SQL是Spark用來處理結構化數據的一個模塊,它提供了一個編程抽象叫作DataFrame而且做爲分佈式SQL查詢引擎的做用。sql

爲何要學習Spark SQL?咱們已經學習了Hive,它是將Hive SQL轉換成MapReduce而後提交到集羣上執行,大大簡化了編寫MapReduce的程序的複雜性,因爲MapReduce這種計算模型執行效率比較慢。因此Spark SQL的應運而生,它是將Spark SQL轉換成RDD,而後提交到集羣執行,執行效率很是快!同時Spark SQL也支持從Hive中讀取數據。數據庫

2、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鏈接。

3、核心概念: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。函數

4、建立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

相關文章
相關標籤/搜索