寫在前面
之前用DF數據類型比較多,RDD相對使用的比較少,回頭再看只想說too simple too young。
Transformation 和Action
Transformation轉換,對rdd而言,每次轉換都會產生新的rdd。
Transformation得到的rdd是惰性求值的,整個轉換過程只記錄了轉換的軌跡,並不是真正的計算,只有遇到Action操作時纔會真正計算。
Action:代表的是一個具體的行爲,返回的值非RDD類型,可以一個object,或者是一個數值,也可以爲Unit代表無返回值,並且action會立即觸發job的執行。
常見的操作類型
Transformation操作 | Action操作 |
---|---|
map | reduce |
flatmap | collect |
reduceByKey | count |
groupByKey | first |
union | take |
join | takeSample |
cogroup | SaveAsTextFile |
sample | SaveAsAequenceFile |
cartesian | countByKey |
sortBykey | foreach |
Transformaton函數
-
map(func,preservesPartitioning=False)
將原來RDD的每個數據通過map中的用戶自定義函數func映射成一個新的元素。返回一個RDD。 -
filter(func)
選出所有func返回值爲true的元素,最爲一個新的RDD返回 -
mapreduce
-
flatmap(func, preservesPartitioning=False)
與map類似,但返回的是所有rdd映射函數func之後的序列集 -
sample(withReplacement, fraction, seed=None)
withReplacement=true 表示有放回抽樣
fraction爲抽樣的概率【0,1】
raction=0.2並不是說明要抽出100個數字中20%的數據作爲樣本,而是每個數字被抽取爲樣本的概率爲0.2,這些數字被認爲來自同一總體,樣本的大小並不是固定的,而是服從二項分佈
seed爲隨機數種子
返回的是RDD的抽樣子集 -
distinct(numPartitions=None)
返回去重之後的RDD
Action函數
-
RDD的所有元素以列表的形式返回
一般在filter或者的時候用
-
count()
返回RDD元素的個數 -
foreach(func)
RDD的每個元素調用func,不返回RDD或者list -
reduce(func)
-
first()
返回數據集中的第一個元素 -
take(num)
-countBykey()
map 和 flatMap的區別
map(f, preservesPartitioning=False)[source]
Return a new RDD by applying a function to each element of this RDD.
flatMap(f, preservesPartitioning=False)[source]
Return a new RDD by first applying a function to all elements of this RDD, and then flattening the results.
flaMap 是先map再扁平化
即將所有對象合併爲一個對象
eg:
a=lines.map(lambda x:x.split(" "))
print(a.collect())
b=lines.flatMap(lambda x:x.split(' '))
print(b.collect())
res:
*ByKey 操作
操作 |
---|
sortByKey |
reduceByKey |
reduceByKeyLocally |
sampleByKey |
subtractByKey |
aggregateByKey |
combineByKey |
countByKey |
foldByKey |
groupBykey |
具體參考spark *ByKey操作