sparkContext.textFile("") 讀取文件時 注意路徑格式:本地文件 file:///D://fileDirctory1//file.txt
hdfs:? hdfs:/user/hdfs/test/textFile? 只支持String類型
以下sc均代表sparkContext。
sc.parallelize(Seq(....))? 將一個本地的scala集合構造一個分布式的RDD 默認兩個分區(qū)
如果傳遞給Parallelize的seq參數是一個可變的集合實例,并且在parallelize調用之后 在針對該RDD的第一次action之前,該集合發(fā)生了改變,則相應的RDD 結果也會隨之而發(fā)生改變,傳遞一份拷貝即可。
避免使用Seq() 或者 Seq[T]() 創(chuàng)建一個空RDD 因為無分區(qū)? 并不會報異常
val rangeRdd = sc.parallelize(1 to 9)
def mapFunc[T](iter:Iterator[T]):Iterator[(T,T)] = {
var res = List[(T,T)]()
var pre = iter.next()
while(iter.hasNext()) {
val cur = iter.next()
res = res.:+(pre.cur)
pre = cur
}
res.toIterator? // 由于 mapPartitions? 的參數為 Iterator? 返回值也為一個Iterator
}
// 針對當前RDD的每個分區(qū)使用一個函數 返回一個新的RDD ‘preserverPartitioning’ 保護分區(qū)標志位
// 表示 input函數 是否保護當前分區(qū) 其默認為false,除非是一個 key-value對RDD input function不修改keys
rangeRdd.mapPartitions(x => mapFunc(x)).foreach(println)
rangeRdd.mapPartitions(x => mapFunc(x),true).foreach(println)
rangeRdd.mapPartitions(mapFunc(_)).foreach(println)
rangeRdd.mapPartitions(mapFunc).foreach(println)
// 針對RDD的每個分區(qū)使用function返回一個新的RDD 同時跟蹤 原始分區(qū)的索引序號 index
// 注意 其中的 (x,iter)? 其中x代表的是當前的分區(qū)號,iter代表的時元素的集合迭代器
val e = rangeRdd.mapPartitionsWithIndex{
(x,iter) => {
var result = List[String]()
var i = 0
while(iter.hasNext()) { i += iter.next()}
result = result.:+(x + "|" + i)
result.toIterator
}}
e.collect().foreach(println)
sc.parallelize(Seq()).foreach(println)
// 針對RDD 的每個分區(qū)執(zhí)行 function f
rangeRdd.foreachPartition(println) // 打印的是? N個分區(qū) 打印N行 non-empty iterator
// 針對RDD 的all elements? 所有元素 執(zhí)行 function f
rangeRdd.foreachPartition(println) // 打印的是? 所有元素
// 將 key-value 對RDD的每個value使用map 函數,不改變keys,仍然保留原始RDD的分區(qū)
rangeRdd.map(x=>(x,x)).mapValues(_+"|").foreach(println)
// 針對當前RDD的所有元素 第一次應用一個map function? 返回一個新的RDD? 并將結果進行扁平化處理
rangeRdd.flatMap(x => 1 to x).foreach(println)
// 將 key-value 對RDD的每個value使用flatmap 函數,不改變keys,仍然保留原始RDD的分區(qū),扁平化處理時,如果對應的value 為null? 該key-value 對 直接刪除
rangeRdd.map(x=>(x,x)).flatMapValues(x => x.to(5)).foreach(println)
// 使用指定的 交換的 和 組合的? 二進制操作 針對RDD 的元素 進行reduce操作,首先reducePartition 然后 mergeResult
println(rangeRdd.reduce(_+_))
println(rangeRdd.reduce((x,y)=>x+y))
// 使用組合的reduce函數 將每個key的values 進行合并操作,在將結果發(fā)送至Reducer之前每個mapper首先會在本地執(zhí)行一次合并操作,類似于MapReduce的combiner操作
println(rangeRdd.map(x => (x,x)).reduceByKey(_+_))
// 使用組合的reduce函數 將每個key的values 進行合并操作,并立即將結果以Map形式返回至master節(jié)點(而不是以Rdd[(T,T)]的形式返回Reducer),在將結果發(fā)送至Reducer之前每個mapper首先會在本地執(zhí)行一次合并操作,類似于MapReduce的combiner操作
println(rangeRdd.map(x => (x,x)).reduceByKeyLocally(_+_))