最近工作用到Spark,這裡記一些自己接觸到的Spark基本概念和知識。 本文鏈接:https://www.cnblogs.com/hhelibeb/p/10288915.html 名詞 RDD:在高層,每個Spark應用包含一個driver程式,它運行用戶的主函數,在集群上執行不同的並行作業。Sp ...
最近工作用到Spark,這裡記一些自己接觸到的Spark基本概念和知識。
本文鏈接:https://www.cnblogs.com/hhelibeb/p/10288915.html
名詞
RDD:在高層,每個Spark應用包含一個driver程式,它運行用戶的主函數,在集群上執行不同的並行作業。Spark中提供的主要抽象是彈性分散式數據集(resilient distributed dataset, RDD),它是分佈在集群節點中的已分區的元素集合,可以被並行處理。RDD從Hadoop文件系統中的文件創建,或者從驅動程式中已有的Scala集創建。用戶也可以要求Spark將RDD持久化在記憶體中,允許它在並行操作中被高效地復用。最後,RDD可以從節點故障中自動恢復。
Spark SQL:一個用於處理結構化數據的Spark模塊。和RDD API不同,Spark SQL提供的介面會提供給Spark關於數據的結構和計算的更多信息。在內部,Spark SQL使用額外的信息來執行額外優化。有許多方式可以與Spark SQL交互,包含SQL和Dataset API。在進行計算時,無論使用哪種API/編程語言,都會使用相同的執行引擎。這意味著開發者可以基於數據變換的需要來自由切換不同的API。
Dataset:Dataset是分散式的數據集合。Dataset是Spark 1.6中新加入的介面,提供了RDD的優勢(強類型化,應用lambda函數的能力),也提供了Spark SQL的優化執行引擎的優勢。Dataset可以由JVM對象構造,然後通過函數變換(map, flatMap, filter等)來操縱。Dataset API在Scala和Java中可用。Python不支持Dataset API,但是由於Python的動態性,已經可以享受許多Dataset API的好處。(例如你可以通過row.columnName的方式自然地訪問行中的欄位)。R語言的情形與之類似。
DataFrame:DataFrame是一種有列名的Dataset。它在概念上等於關係資料庫中的表或者R/Python中的數據幀,但是在底層有更多的優化。DataFrame可以從一個多重源構造,比如:結構化數據文件、Hive中的表、外部資料庫或者既有的RDD。DataFrame API在Scala、Java、Python和R中可用。在Scala和Java,DataFrame被表示為多行Dataset。在Scala API中,Dataframe可以簡單地表示為Dataset[Row]。而在Java API中,用戶需要使用Dataset<Row>來表示Dataframe。
TempView:createOrReplaceTempView方法會創建(如果已存在同名視圖的話,則替換)一個惰性計算視圖,你可以將這個視圖視作hive表來使用。除非你將Dataset緩存,否則它不會持久化到記憶體中。可以使用spark.catalog.dropTempView("tempViewName")來刪除視圖。
Caching and Persistence:緩存或持久化是Spark計算的優化技術。 它們有助於保存臨時部分結果,以便可以在後續階段重覆使用。 因此,RDD的這些中間結果保存在記憶體(預設)或固態存儲(如磁碟和/或複製)中。
SparkSession:Spark SQL的入口點。在開發Spark SQL應用時,這是首先要創建的對象之一。
你可以使用SparkSession.builder方法來創建SparkSession。
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder .appName("My Spark Application") // optional and will be autogenerated if not specified .master("local[*]") // only for demo and testing purposes, use spark-submit instead .enableHiveSupport() // self-explanatory, isn't it? .config("spark.sql.warehouse.dir", "target/spark-warehouse") .withExtensions { extensions => extensions.injectResolutionRule { session => ... } extensions.injectOptimizerRule { session => ... } } .getOrCreate
一旦被創建,SparkSession會允許你創建Dataframe(基於RDD或一個Scala Seq等),創建Dataset,方為Saprk SQL服務(例如ExperimentalMethods, ExecutionListenerManager, UDFRegistration),運行SQL查詢,載入表以及訪問DataFrameReader介面以載入選定格式的Dataset。
你的單個應用中可以有多個SparkSession。常見的用例是讓每個SparkSession保持關係實體在邏輯上分離。
模塊
SparkContext: Spark功能的主入口。
RDD: 彈性分散式數據集,見上文。
Broadcast: 可以在task間復用的廣播變數。
Accumulator: 只允許增加值的共用變數。
SparkConf: 配置Spark用。
SparkFiles: 訪問由作業載入的文件。
StorageLevel: 緩存持久化的級別。
TaskContext: 當前運行的作業的信息(實驗性)。
RDDBarrier: 用屏障包裝RDD以實現屏障執行。
BarrierTaskContext: 為屏障執行提供額外信息和工具的TaskContext.
BarrierTaskInfo: 與屏障作業有關的信息。
類
pyspark.sql.SparkSession: Dataframe和Spark SQL功能的主入口點。
pyspark.sql.DataFrame: 按列名分組的分散式數據集合,見上文。
pyspark.sql.Column: Dataframe中的列表達式。
pyspark.sql.Row: Dataframe中的行。
pyspark.sql.GroupedData: 聚合方法, 由 DataFrame.groupBy()返回.
pyspark.sql.DataFrameNaFunctions: 處理丟失數據(null值)的方法。
pyspark.sql.DataFrameStatFunctions: 靜態功能方法。
pyspark.sql.functions: 對Dataframe可用的內建函數。
pyspark.sql.types: 可用的數據類型列表、
pyspark.sql.Window: 用於使用Window函數
參考:
How does createOrReplaceTempView work in Spark?