7. Spark SQL
1.分析SparkSQL出現的原因,並簡述SparkSQL的起源與發展。
-
SparkSQL出現的原因
hive是shark的前身,shark是sparkSQL的前身,sparkSQL產生的根本原因是其完全脫離了hive的限制,hive是hive SQL轉換成MapReduce然後提交到叢集上執行,大大簡化了編寫MapReduce的程式複雜性。同時也由於MapReduce的計算執行效率很慢,因此spark SQL就這樣出來,就是將spark SQL轉換成RDD,然後提交到叢集上執行,這樣效率就非常快。
-
SparkSQL的起源
在三四年前,Hive可以說是SQL on Hadoop的唯一選擇,負責將SQL編譯成可擴充套件的MapReduce作業。鑑於Hive的效能以及與Spark的相容,Shark專案由此而生。
Shark即Hive on Spark,本質上是通過Hive的HQL解析,把HQL翻譯成Spark上的RDD操作,然後通過Hive的metadata獲取資料庫裡的表資訊,實際HDFS上的資料和檔案,會由Shark獲取並放到Spark上運算。
Shark的最大特性就是快和與Hive的完全相容,且可以在shell模式下使用rdd2sql()這樣的API,把HQL得到的結果集,繼續在scala環境下運算,支援自己編寫簡單的機器學習或簡單分析處理函式,對HQL結果進一步分析計算。
-
SparkSQL的發展
在2014年7月1日的Spark Summit上,Databricks宣佈終止對Shark的開發,將重點放到Spark SQL上。
Databricks表示,Spark SQL將涵蓋Shark的所有特性,使用者可以從Shark 0.9進行無縫的升級。
Databricks推廣的Shark相關專案一共有兩個,分別是Spark SQL和新的Hive on Spark(HIVE-7292)
Databricks表示,Shark更多是對Hive的改造,替換了Hive的物理執行引擎,因此會有一個很快的速度。然而,不容忽視的是,Shark繼承了大量的Hive程式碼,因此給優化和維護帶來了大量的麻煩。
2.簡述RDD 和DataFrame的聯絡與區別?
區別:
RDD是分散式的java物件的集合,但是物件內部結構對於RDD而言卻是不可知的。
DataFrame是一種以RDD為基礎的分散式資料集,提供了詳細的結構資訊,相當於關係資料庫中的一張表。
聯絡:
1.都是spark平臺下的分散式彈性資料集,為處理超大型資料提供便利。
2、都有惰性機制,在進行建立、轉換,如map方法時,不會立即執行,只有在遇到Action才會運算。
3.都會根據spark的記憶體情況自動快取運算,這樣即使資料量很大,也不用擔心會記憶體溢位
4、三者都有partition的概念。
5.三者有許多共同的函式,如filter,排序等。
3.DataFrame的建立與儲存
3.1 PySpark-DataFrame建立:
spark.read.text(url)
spark.read.json(url)
spark.read.format("text").load("people.txt")
spark.read.format("json").load("people.json")
描述從不同檔案型別生成DataFrame的區別。
text檔案生成的DataFrame只有value屬性;而json檔案生成的DataFrame會識別到檔案中的鍵值
用相同的txt或json檔案,同時建立RDD,比較RDD與DataFrame的區別。
3.2 DataFrame的儲存
df.write.text(dir)
df.write.json(dri)
df.write.format("text").save(dir)
df.write.format("json").save(dir)
4.選擇題:
4.1單選(2分)關於Shark,下面描述正確的是:C
A.Shark提供了類似Pig的功能
B.Shark把SQL語句轉換成MapReduce作業
C.Shark重用了Hive中的HiveQL解析、邏輯執行計劃翻譯、執行計劃優化等邏輯
D.Shark的效能比Hive差很多
4.2單選(2分)下面關於Spark SQL架構的描述錯誤的是:D
A.在Shark原有的架構上重寫了邏輯執行計劃的優化部分,解決了Shark存在的問題
B.Spark SQL在Hive相容層面僅依賴HiveQL解析和Hive元資料
C.Spark SQL執行計劃生成和優化都由Catalyst(函式式關係查詢優化框架)負責
D.Spark SQL執行計劃生成和優化需要依賴Hive來完成
4.3單選(2分)要把一個DataFrame儲存到people.json檔案中,下面語句哪個是正確的:A
A.df.write.json("people.json")
B.df.json("people.json")
C.df.write.format("csv").save("people.json")
D.df.write.csv("people.json")
4.4多選(3分)Shark的設計導致了兩個問題:AC
A.執行計劃優化完全依賴於Hive,不方便新增新的優化策略
B.執行計劃優化不依賴於Hive,方便新增新的優化策略
C.Spark是執行緒級並行,而MapReduce是程序級並行,因此,Spark在相容Hive的實現上存線上程安全問題,導致Shark不得不使用另外一套獨立維護的、打了補丁的Hive原始碼分支
D.Spark是程序級並行,而MapReduce是執行緒級並行,因此,Spark在相容Hive的實現上存線上程安全問題,導致Shark不得不使用另外一套獨立維護的、打了補丁的Hive原始碼分支
4.5 多選(3分)下面關於為什麼推出Spark SQL的原因的描述正確的是:AB
A.Spark SQL可以提供DataFrame API,可以對內部和外部各種資料來源執行各種關係操作
B.可以支援大量的資料來源和資料分析演算法,組合使用Spark SQL和Spark MLlib,可以融合傳統關係資料庫的結構化資料管理能力和機器學習演算法的資料處理能力
C.Spark SQL無法對各種不同的資料來源進行整合
D.Spark SQL無法融合結構化資料管理能力和機器學習演算法的資料處理能力
4.6多選(3分)下面關於DataFrame的描述正確的是:ABCD
A.DataFrame的推出,讓Spark具備了處理大規模結構化資料的能力
B.DataFrame比原有的RDD轉化方式更加簡單易用,而且獲得了更高的計算效能
C.Spark能夠輕鬆實現從MySQL到DataFrame的轉化,並且支援SQL查詢
D.DataFrame是一種以RDD為基礎的分散式資料集,提供了詳細的結構資訊
4.7多選(3分)要讀取people.json檔案生成DataFrame,可以使用下面哪些命令:AC
A.spark.read.json("people.json")
B.spark.read.parquet("people.json")
C.spark.read.format("json").load("people.json")
D.spark.read.format("csv").load("people.json")
5. PySpark-DataFrame各種常用操作
基於df的操作:
列印資料 df.show()預設列印前20條資料
列印概要 df.printSchema()
查詢總行數 df.count()
df.head(3) #list型別,list中每個元素是Row類
()
輸出全部行 df.collect() #list型別,list中每個元素是Row類
查詢概況 df.describe().show()
取列 df[‘name’], df.name, df[1]
選擇 df.select() 每個人的年齡+1
篩選 df.filter() 20歲以上的人員資訊
篩選年齡為空的人員資訊
分組df.groupBy() 統計每個年齡的人數
排序df.sortBy() 按年齡進行排序
基於spark.sql的操作
建立臨時表 df.registerTempTable('people')
spark.sql執行SQL語句 spark.sql('select name from people').show()
6.選擇題
6.1單選(2分)以下操作中,哪個不是DataFrame的常用操作:D
A.printSchema()
B.select()
C.filter()
D.sendto()
6.2多選(3分)從RDD轉換得到DataFrame包含兩種典型方法,分別是:AB
A.利用反射機制推斷RDD模式
B.使用程式設計方式定義RDD模式
C.利用投影機制推斷RDD模式
D.利用互聯機制推斷RDD模式
6.3多選(3分)使用程式設計方式定義RDD模式時,主要包括哪三個步驟:ABD
A.製作“表頭”
B.製作“表中的記錄”
C.製作對映表
D.把“表頭”和“表中的記錄”拼裝在一起