《Learning Spark》這本書算是Spark入門的必讀書了,中文版是《Spark快速大數據分析》,不過豆瓣書評頗有意思的是,英文原版評分7.4,評論都說入門而已深刻不足,中文譯版評分8.4,評論一片好評,有點意思。我倒以爲這本書能夠做爲官方文檔的一個補充,刷完後基本上對Spark的一些基本概念、碼簡單的程序是沒有問題的了。這本書有一個好處是它是用三門語言寫的,Python/Java/Scala,因此適用性很廣,個人觀點是,先精通一門語言,再去學其餘語言。因爲我工做中比較經常使用的是Python,因此就用把Python相關的命令總結一下。下一階段再深刻學習Java和Scala。這一篇總結第一章-第三章的重點內容。shell
1 A = [1,2,3,4,5] 2 lines = sc.parallelize(A) 3 #另外一種方式
4 lines = sc.parallelize([1,2,3,4,5])
map( )和flatMap( )的聯繫和區別 緩存
map( ):接收一個函數,應用到RDD中的每一個元素,而後爲每一條輸入返回一個對象。
filter( ):接收一個函數,將函數的元素放入新的RDD中返回。
flatMap( ):接收一個函數,應用到RDD中的每一個元素,返回一個包含可迭代的類型(如list等)的RDD,能夠理解爲先Map(),後flat().
1 distinct( )、union( )、intersection( )、subtract( ) 2 distinct( ):去重 3 union( ):兩個RDD的並集 4 intersection( ):兩個RDD的交集 5 subtract( ):兩個RDD的補集 6 cartesian( ):兩個RDD的笛卡爾積(能夠應用於計算類似度中,如計算各用戶對各類產品的預期興趣程度)
1 reduce( ):接收一個函數做爲參數,這個函數要操做兩個相同元素類型的RDD,也返回一個一樣類型的RDD,能夠計算RDD中元素的和、個數、以及其餘聚合類型的操做。 2 3 fold( ):和reduce同樣,但須要提供初始值。 4 5 aggregate( ):和fold相似,但一般返回不一樣類型的函數。 6 7 注:
關於fold()和aggregate(),再說點題外話。fold()只能作同構聚合操做,就是說,若是你有一個RDD[X],經過fold,你只能構造出一個X。可是若是你想經過RDD[X]構造一個Y呢?那就得用到aggregate()了,使用aggregate時,須要提供初始值(初始值的類型與最終返回的類型相同),而後經過一個函數把一RDD的元素合併起來放到累加器裏,再提供一個函數將累加器兩兩相加。由此能夠看出,fold()須要保證滅個partition可以獨立進行運算,而aggregate()對於不一樣partition(分區)提交的最終結果專門定義了一個函數來進行處理。
RDD還有不少其餘的操做命令,譬如collect(),count(),take(),top(),countByValue(),foreach()等,限於篇幅,就不一一表述了。分佈式
1 class MyClass(object): 2 def __init__(self): 3 self.field = 「Hello」 4
5 def doStuff(self, rdd): 6 #報錯:由於在self.field中引用了整個self
7 return rdd.map(lambda s: self.field + x)
解決方法:直接把你須要的字段拿出來放到一個局部變量裏,而後傳遞這個局部變量就能夠了。函數
1 class MyClass(object): 2 def __init__(self): 3 self.field = 「Hello」 4
5 def doStuff(self, rdd): 6 #將須要的字段提取到局部變量中便可
7 field = self.field 8 return rdd.map(lambda s: field + x)
前面三章講了Spark的基本概念和RDD的特性以及一些簡單的命令,比較簡單。後面三章主要講了鍵值對操做、數據的讀取和保存以及累加器、廣播變量等,下週再更新。性能