RDD 操作二 常用的 Transformations 與 Actions 方法
原文地址: http://spark.apache.org/docs/latest/programming-guide.html#transformations
僅限交流使用,轉(zhuǎn)載請注明出處。如有錯誤,歡迎指出!
Henvealf/譯
Transformations 轉(zhuǎn)換
這里只有 Scala 的API,Java 與 Python 請看官方API。
Transformation | 啥意思啊 |
---|---|
map(func) | 返回每個元素經(jīng)過 func 方法處理后,所生成的新元素所組成的分布式數(shù)據(jù)集合(RDD)。 |
filter(func) | 返回一個通過了方法 func 篩選的元素所組成的數(shù)據(jù)集合;func 返回 true,即代表通過篩選。 |
flatMap(func) | 與 map 相似,不過每一個輸入項能夠被映射為0個或多個輸出項(所以 func 應(yīng)該返回一個Seq(隊列) 而不是一個單項)。 |
mapPartitions(func) | 與 map 相似,但是他是單獨運行在 RDD 的每一個分區(qū)(塊)上,所以假如 RDD 是類型 T 時,則 func 的類型必須為 Iterator<T> => Iterator<U> 。 |
mapPartitionsWithIndex(func) | 與 mapPartitions 相似,但是會另外提供一個整數(shù)值代表分區(qū)的下標(index), 所以假如 RDD 是類型 T 時,func 的類型必須為 (Int, Iterator<T>) => Iterator<U>. |
sample(withReplacement, fraction, seed) | 第一參數(shù)是指明是否放回,第二個參數(shù)是抽取數(shù)量,第三個是隨機種子。 |
union(otherDataset) | 返回一個包含了源數(shù)據(jù)集和參數(shù)的新數(shù)據(jù)集 |
intersection(otherDataset) | 返回一個元數(shù)據(jù)集與參數(shù)的相交之后的新的 RDD(就是交集)。 |
distinct([numTasks]) | 對數(shù)據(jù)集進行去重操作 |
groupByKey([numTasks]) | 當(dāng)在一個(K,V)數(shù)據(jù)集上調(diào)用他,會返回一個 (K, Iterator<V>) 數(shù)據(jù)集。 注意 :當(dāng)你分組他們是為了在每個Key上聚合他們(比如求和或者平均值),使用 reduceByKey 或者 aggregateByKey 將會收益到更高的性能。注意 :輸出的并發(fā)水平依賴于父 RDD 分區(qū)的個數(shù)。你能通過可選的 numTasks 參數(shù)設(shè)置不同的 task 數(shù)目。 |
reduceByKey(func, [numTasks]) | 當(dāng)在一個(K,V)數(shù)據(jù)集上調(diào)用他時,將會返回一個在不同的key上進行了聚合了Value的新的 (K,V) 數(shù)據(jù)集,聚合的方式是使用 func 方法指定,且必須是 (V,V) => V 類型的。 與 groupByKey 很像,reduce task 的個數(shù)是使用第二個可選參數(shù)指定的。 |
aggregateByKey(zeroValue)(seqOp, combOp, [NumTasks]) | 當(dāng)在一個(K,V)類型的數(shù)據(jù)集上調(diào)用他時,他就會返回一個按照 key 來進行聚合后生成的 (K,U) 對,聚合的方式是通過提供一個合并方法和一個中立的“零”值來完成的。允許被聚合的 value 的類型與輸入的 value 的類型不一樣,這樣可以禁止沒必要的分配。和 groupByKey相似,reduce task 的個數(shù)是使用第二個可選參數(shù)指定的。 |
sortByKey([ascending],[numTasks]) | 在(K,V)類型上調(diào)用他以實現(xiàn)按 K 排序。返回排序后的鍵值對。使用第一參數(shù)(boolean)值來決定是否為升序。 |
join(otherDataset, [numTasks]) | 通過該方法可以按照 K 來將源數(shù)據(jù)集合與另一數(shù)據(jù)集合進行 join 操作。(K, V) 和 (K, W) join結(jié)果就是 (K,(V,W))。outer join 就直接使用 leftOuterJoin,rightOuterJoin,fullOuterJoin 。 |
cogroup(otherDataset,[numTasks]) | 當(dāng)在 (K, V) 類型與 (K, W)類型調(diào)用該方法時,會返回一個元祖 (K, (Iterable<V>, Iterable<W>)) 。也可以使用 groupWith 來調(diào)用。 |
cartesian(otherDataset) | 當(dāng)在 T 類型與 U類型 的數(shù)據(jù)集上調(diào)用他,就返回一個 (T,U) 類型的數(shù)據(jù)集(所有元素組成的鍵值對)。 |
pipe(command,[envVars]) | 通過 shell 命令將 RDD 的每個分區(qū)進行導(dǎo)流, RDD 元素就可以寫入到進程的 stdin(標準輸入) ,也可以按照字符串的形式將其來按行輸出的 stdout(標準輸入) |
repatition(numPartitions) | 通過重新修改 partition 的個數(shù)來對 RDD 中的數(shù)據(jù)重新進行洗牌,以平衡分區(qū)。他總是對網(wǎng)絡(luò)上的所有數(shù)據(jù)進行重洗。 |
Actions 動作
Action | 用法 |
---|---|
reduce(func) | 使用一個 func 來聚合一個數(shù)據(jù)集,方法應(yīng)該為兩個參數(shù),一個返回值。這個方法必須能夠翻轉(zhuǎn)與連接,以至于能夠在并發(fā)運行時的計算是正確的。 |
collect() | 以數(shù)組的形式返回在驅(qū)動器上的數(shù)據(jù)集的所有元素。當(dāng)一個過濾器或者其他操作返回了一個小的子集時,使用這個方法會變得非常高效。 |
first() | 返回數(shù)據(jù)集行的第一個元素。 |
take(n) | 以數(shù)組的形式返回數(shù)據(jù)集上的前 n 個元素。 |
takeSample(withReplacement, num, [seed]) | 返回抽樣后的數(shù)據(jù)組成的數(shù)組,第一個參數(shù)是時候放回取樣,第二個就是取樣的個數(shù),第三個可選的參數(shù)是取樣種子。 |
takeOrdered(n, [ordering]) | 返回 RDD 排序后的前 n 個元素。排序方式要么就使用原生的排序方式,要么使用自定義的比較器排序,使用第二個可選參數(shù)傳入。 |
saveAsTextFile(path) | 將數(shù)據(jù)集中的元素寫成一個文本文件,或者多個文本問價,參數(shù)就是文件路徑,可以寫在本地文件系統(tǒng),HDFS,或者其他 Hadoop 支持的文件系統(tǒng)中。Spark 會在每一個元素上調(diào)用 toString 方法,轉(zhuǎn)成文本文件中的一行文本。 |
saveAsSequenceFile(path) --Java and Scala | 就是將 RDD 中的元素寫成 Hadoop SequenceFile到本地文件系統(tǒng),HDFS,或者其他 Hadoop 支持的文件系統(tǒng)。 且 RDDs 中可用的的鍵值對必須實現(xiàn) Hadoop 的 Writable 接口。在 Scala 中,也有許多可用的能夠隱含的轉(zhuǎn)型為 Writable 的類型,例如 Int, Double, String。 |
savaAsObjectFile(path) --Java and Scala | 使用 Java 簡單的序列化方式,將 RDD 中的元素進行序列化。 可以使用 SparkContext.objectFile() 方法來加載。 |
countByKey() | 按照 數(shù)據(jù)集中的 Key 進行分組,計算各個 K 的對應(yīng)的個數(shù)。(K,V)返回 (K,Int) |
foreach(func) | 在數(shù)據(jù)集上的每個元素上運行 func 方法。上面提到了。 |
Spark RDD API 也提供了一些 action 的異步版本,比如 foreach 對應(yīng)的 foreachAsync 。