天天看點

大資料為什麼那麼火?一文帶你了解Spark與SQL結合的力量

  Spark是一種大規模、快速計算的叢集平台,本頭條号試圖通過學習Spark官網的實戰演練筆記提升筆者實操能力以及展現Spark的精彩之處。有關架構介紹和環境配置可以參考以下内容:

  linux下Hadoop安裝與環境配置(附詳細步驟和安裝包下載下傳)

  linux下Spark安裝與環境配置(附詳細步驟和安裝包下載下傳)

  本文的參考配置為:Deepin 15.11、Java 1.8.0_241、Hadoop 2.10.0、Spark 2.4.4、scala 2.11.12

  一、Spark SQL入門

  Spark SQL 是 Spark 處理結構化資料的一個子產品。與基礎的 Spark RDD API 不同,Spark SQL 提供了查詢結構化資料及計算結果等資訊的接口。在内部,Spark SQL 使用這個額外的資訊去執行額外的優化。有幾種方式可以跟 Spark SQL 進行互動,包括 SQL 和 Dataset API。當使用相同執行引擎進行計算時,無論使用哪種 API / 語言都可以快速的計算。這種統一意味着開發人員能夠在基于提供最自然的方式來表達一個給定的 transformation API 之間實作輕松的來回切換不同的。

  1.Spark Session

  Spark SQL中所有功能的入口點是SparkSession 類。要建立一個 SparkSession,僅使用 SparkSession.builder()就可以了。如果提示已建立的Warning,則代表之前有建立SparkSession,有些設定不會生效,可以通過.stop方法先停止目前SparkSession。

  2.建立DataFrames

  在一個 SparkSession中,應用程式可以從一個已經存在的 RDD,從hive表,或者從 Spark資料源中建立一個DataFrames。

  一個 Dataset 是一個分布式的資料集合 Dataset 是在 Spark 1.6 中被添加的新接口,它提供了 RDD 的優點(強類型化,能夠使用強大的 lambda 函數)與Spark SQL執行引擎的優點。一個 Dataset 可以從 JVM 對象來 構造 并且使用轉換功能(map,flatMap,filter,等等)。一個 DataFrame 是一個 Dataset 組成的指定列。

  3.SQL語句運作

  SparkSession 的 sql 函數可以讓應用程式以程式設計的方式運作 SQL 查詢,并将結果作為一個 DataFrame 傳回。

  Spark SQL中的臨時視圖是session級别的,也就是會随着session的消失而消失。如果你想讓一個臨時視圖在所有session中互相傳遞并且可用,直到Spark 應用退出,你可以建立一個全局的臨時視圖。全局的臨時視圖存在于系統資料庫 global_temp中,我們必須加上庫名去引用它,比如。SELECT * FROM global_temp.view1。

  4.建立DataSets

  Dataset 與 RDD 相似,然而,并不是使用 Java 序列化或者 Kryo 編碼器來序列化用于處理或者通過網絡進行傳輸的對象。雖然編碼器和标準的序列化都負責将一個對象序列化成位元組,編碼器是動态生成的代碼,并且使用了一種允許 Spark 去執行許多像 filtering,sorting 以及 hashing 這樣的操作,不需要将位元組反序列化成對象的格式。

  5.RDD互操作性

  Spark SQL 支援兩種不同的方法用于轉換已存在的 RDD 成為 Dataset,分别是使用反射推斷Schema和以程式設計的方式指定Schema。

  Spark SQL 的 Scala 接口支援自動轉換一個包含 case classes 的 RDD 為 DataFrame。Case class 定義了表的 Schema。Case class 的

二手手遊轉讓平台

參數名使用反射讀取并且成為了列名。Case class 也可以是嵌套的或者包含像 Seq 或者 Array 這樣的複雜類型。這個 RDD 能夠被隐式轉換成一個 DataFrame 然後被注冊為一個表。表可以用于後續的 SQL 語句。

  6.UDF自定義函數

  内置的DataFrames函數提供常見的聚合,例如count(),countDistinct(),avg(),max(),min()等。盡管這些函數是為DataFrames設計的,但使用者不限于預定義的聚合功能,還可以建立自己的功能。

  二、資料源

  Spark SQL 支援通過 DataFrame 接口對各種 data sources(資料源)進行操作。DataFrame 可以使用 relational transformations(關系轉換)操作,也可用于建立 temporary view(臨時視圖)。将 DataFrame 注冊為 temporary view(臨時視圖)允許您對其資料運作 SQL 查詢。本節 描述了使用 Spark Data Sources 加載和儲存資料的一般方法,然後涉及可用于 built-in data sources(内置資料源)的 specific options(特定選項)。

  1.通用功能

  在最簡單的形式中,預設資料源(parquet,除非另有配置 spark.sql.sources.default)将用于所有操作。還可以手動指定資料源格式。對于内置的源,你也可以使用它們的 短名稱(json,parquet,jdbc,orc,libsvm,csv,text)。從任何 data source type(資料源類型)加載 DataFrames 可以使用此 syntax(文法)轉換為其他類型。

  儲存操作可以選擇使用 SaveMode,它指定如何處理現有資料如果存在的話。重要的是這些儲存模式不使用任何鎖定。另外,當執行 Overwrite 時,資料将在新資料寫出之前被删除。DataFrames 也可以使用 saveAsTable 指令作為 persistent tables(持久表)儲存到 Hive metastore 中。對于基于檔案的資料源,也可以對 output(輸出)進行 bucket 和 sort 或者 partition。Bucketing 和 sorting 僅适用于 persistent tables 。

  2.Hive表

  Spark SQL 還支援讀取和寫入存儲在 Apache Hive 中的資料。但是,由于 Hive 具有大量依賴關系,是以這些依賴關系不包含在預設 Spark 分發中。如果在類路徑中找到 Hive 依賴項,Spark 将自動加載它們。請注意,這些 Hive 依賴關系也必須存在于所有工作節點上,因為它們将需要通路 Hive 序列化和反序列化庫(SerDes),以通路存儲在 Hive 中的資料。

  建立 Hive 表時,需要定義如何 從/向 檔案系統 read/write 資料,即 “輸入格式” 和 “輸出格式”。您還需要定義該表如何将資料反序列化為行,或将行序列化為資料,即 “serde”。以下選項可用于指定存儲格式(“serde”, “input format”, “output format”),例如,CREATE TABLE src(id int) USING hive OPTIONS(fileFormat 'parquet')。預設情況下,我們将以純文字形式讀取表格檔案。請注意,Hive 存儲處理程式在建立表時不受支援,您可以使用 Hive 端的存儲處理程式建立一個表,并使用 Spark SQL 來讀取它。

  3.JDBC資料庫

  Spark SQL 還包括可以使用 JDBC 從其他資料庫讀取資料的資料源。此功能應優于使用 JdbcRDD。這是因為結果作為 DataFrame 傳回,并且可以輕松地在 Spark SQL 中處理或與其他資料源連接配接。JDBC 資料源也更容易從 Java 或 Python 使用,因為它不需要使用者提供 ClassTag。(請注意,這不同于 Spark SQL JDBC 伺服器,允許其他應用程式使用 Spark SQL 運作查詢)。

  有關Spark SQL的内容至此結束,下文将進一步對Spark Streaming即Spark流處理的内容做詳細介紹。前文筆記請參考下面的連結:

  Spark大資料分布式處理實戰:一文帶你走進大資料世界

  學大資料一點也不難!一文帶你了解RDD與共享變量(附安裝教程)