Spark SQL 使用反射推斷模式

此方法使用反射來生成包含特定類型的對象的RDD的模式。 Spark SQL的Scala接口支持將包含案例類的RDD自動轉換為DataFrame。 case類定義了表的模式。 case類的參數的名稱使用反射讀取,它們成為列的名稱。

案例類也可以嵌套或包含複雜類型,如序列或數組。 此RDD可以隱式地轉換為DataFrame,然後註冊為表。 表可以在後續的SQL語句中使用。

讓我們考慮一個名為employeeee.txt的文本文件中的員工記錄示例。 通過從文本文件讀取數據並使用默認SQL函數將其轉換為DataFrame來創建RDD。

給定數據 - 查看在運行spark shell點的當前相應目錄中名為employees.txt的文件的以下數據。

以下示例說明如何使用“反射”生成模式。

啟動Spark Shell

使用以下命令啟動Spark Shell。

創建SQLContext

使用以下命令生成SQLContext。 這裡,scmeans是SparkContext對象。


導入SQL函數

使用以下命令導入用於將RDD隱式轉換為DataFrame的所有SQL函數。

創建Case Class

接下來,我們必須使用案例類定義員工記錄數據的模式。 以下命令用於根據給定數據(id,name,age)聲明Case Class。

創建RDD和應用轉換

使用以下命令生成RDD namedemplby,從中讀取數據fromemployee.txt並使用Map函數將其轉換為DataFrame。這裡,定義了兩個映射函數。 一個是將文本記錄分割成字段(.map(_。split(“,”)))和第二個映射函數用於將單個字段(id,name,age)轉換為一個case類對象 0).trim.toInt,e(1),e(2).trim.toInt))。最後,toDF()方法用於將具有模式的案例類對象轉換為DataFrame。


輸出:

將DataFrame數據存儲在表中

使用以下命令將DataFrame數據存儲到名為employeeee的表中。 在這個命令之後,我們可以應用所有類型的SQL語句。

員工表已準備就緒。 讓我們現在使用SQLContext.sql()方法在表上傳遞一些sql查詢。
選擇DataFrame上的查詢


使用以下命令從theemployableable中選擇所有記錄。 這裡,我們使用變量allrecords來捕獲所有記錄數據。 要顯示這些記錄,請調用show()方法。

要查看allrecords DataFrame的結果數據,請使用以下命令。

輸出:

子句SQL查詢數據幀

使用以下命令在表中應用where語句。 這裡,變量agefilter存儲年齡在20和35之間的僱員的記錄。

要查看agefilter數據幀的結果數據,請使用以下命令。

輸出:

前兩個查詢是針對整個表DataFrame傳遞的。 現在讓我們嘗試通過對其應用Transform來從結果DataFrame獲取數據。

使用列索引從agefilter 數據幀獲取ID值以下語句用於從agefilter RDD結果中獲取ID值,使用字段索引。

輸出

這種基於反射的方法可以獲得更加簡潔的代碼,並且在編寫Spark應用程序時更好地瞭解其概要。