您好,登錄后才能下訂單哦!
這篇文章主要介紹“Apache Spark2.0的核心結構是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Apache Spark2.0的核心結構是什么”文章能幫助大家解決問題。
DataFrames, Datasets 以及 Spark SQL
在步驟3中,你已經了解到彈性分布式數據集(RDDs)——它們構成了Spark的核心數據抽象概念,是其他所有更高層次數據抽象和API、包括DataFrame和數據集的基礎。
在Spark2.0,在RDDs之上的DataFrame和數據集形成了核心的高層和結構化的分布式數據抽象。DataFrame在Spark里被叫做數據列(data column),它們可以執行組織數據的計劃,以及數據處理或者描述運算、發布查詢。數據集更進一步,提供了一個嚴格的編譯時類型的安全保障,所以特定類型的錯誤在編譯時就會被發現,而不是在運行時。
憑借數據結構和數據類型,Spark可以理解你將如何進行描述運算,哪些指定類型的列或者特定名稱的字段將會訪問你的數據,以及你將使用哪些特定操作的作用域。然后,Spark將會通過Spark 2.0’s Catalyst optimizer優化你的代碼,通過Project Tungsten生成高效的字節代碼。
DataFrame和數據集為多種高級編程語言提供了API,讓你的代碼更易讀,以及支持高階函數比如filter, sum, count, avg, min, max等等。不管你用Spark SQL還是Python、Java、Scala或者R來表達你的計算指令,底層的代碼生成是完全一致的,因為所有的執行的計劃都是通過同一Catalyst優化器。
例如,Scala的作用域專用代碼或者它SQL里對應的相關查詢會生成完全相同的代碼。比如下方會有一個數據集Scala項目叫做Person,以及一個SQL表格“Person”。
// a dataset object Person with field names fname, lname, age, weight // access using object notation val seniorDS = peopleDS.filter(p=>p.age > 55) // a dataframe with structure with named columns fname, lname, age, weight // access using col name notation Val seniorDF = peopleDF.where(peopleDF("age") > 55) // equivalent Spark SQL code val seniorDF = spark.sql("SELECT age from person where age > 35")
為什么Spark結構化數據很重要,為什么DataFrame、數據集、Spark SQL提供了一個高效的Spark編碼方式,如果你希望了解這些,可以通過鏈接(https://youtu.be/1a4pgYzeFwE )的視頻尋找答案。
##五、GraphFrame的圖形處理
盡管Spark有一個通用的基于RDD的圖形處理庫GraphX,可以優化分布式計算以及支持圖形算法,它仍有一些挑戰——沒有Java和Python API,基于低層的RDD API。由于這些問題,它不能通過Project Tungsten 和Catalyst Optimizer享受到最近引入的性能優化。
相比之下,基于DataFrame的圖處理庫GraphFrames解決了所有問題:它提供了一個類似于GraphX的庫但是有著更高的層級,更易讀和可讀的API,支持Java, Scala 和Python;可以保存和下載圖形;利用了Spark2.0的底層性能和查詢的優化。此外,它集成了GraphX。這意味著你可以無縫地將圖處理庫GraphFrames轉換成等效的GraphX表示。
在下圖中,這些城市有各個機場代號,所有頂點可以表示成DataFrame的排;同樣地,所有邊也可以看做DataFrame的排,它們有著各自的名字和類型的列。總的來說,這些DataFrame的頂點和邊構成了一個圖處理庫GraphFrames。
// create a Vertices DataFrame val vertices = spark.createDataFrame(List(("JFK", "New York", "NY"))).toDF("id", "city", "state") // create a Edges DataFrame val edges = spark.createDataFrame(List(("JFK", "SEA", 45, 1058923))).toDF("src", "dst", "delay", "tripID") // create a GraphFrame and use its APIs val airportGF = GraphFrame(vertices, edges) // filter all vertices from the GraphFrame with delays greater an 30 mins val delayDF = airportGF.edges.filter("delay > 30") // Using PageRank algorithm, determine the Airport ranking of importance val pageRanksGF = airportGF.pageRank.resetProbability(0.15).maxIter(5).run() display(pageRanksGF.vertices.orderBy(desc("pagerank")))
使用GraphFrame可以表達三種強大的查詢。首先是簡單的SQL類型的關于點和邊的查詢,比如怎么樣的路線可能會導致重大延遲。第二,圖形類型查詢,比如有多少頂點傳入有多少邊傳出。第三,主題查詢,通過提供一個結構化的模型或者路徑的頂點和邊,找到在圖形中的數據集的模型。
此外,圖處理庫GraphFrames可以很輕松地支持GraphX所有圖形算法。例如,使用PageRank找到所有重要的點,或者決定從起點到目的地的最短路徑,或者執行一個廣度優先搜索(BFS),或者為探索聯絡關系確定強聯系的點。
在網絡研討會中(http://go.databricks.com/graphframes-dataframe-based-graphs-for-apache-spark )中,Spark的社區貢獻者Joseph Bradley給大家介紹了使用圖處理庫GraphFrames進行圖像處理的動機和易用性,以及基于DataFrame的API的好處。作為研討會的一部分,你也將了解到使用圖處理庫GraphFrames的便捷,以及上述所有類型的查詢和算法。
Apache Spark 2.0和許多Spark的組件,包括機器學習MLlib和Streaming,因為性能提升、易用性和高層次的抽象及結構,越來越傾向于提供等效的DataFrame API。在必要或者適合的用例中,你可以選擇使用圖處理庫GraphFrames來代替GraphX。下圖是一個GraphX和圖處理庫GraphFrames之間簡潔的總結和比較。
圖處理庫GraphFrames必會發展得越來越快。新版本的GraphFrame將作為Spark的一個包和Spark2.0兼容。
關于“Apache Spark2.0的核心結構是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。