通過demon 演示 rdd的操作
文件 student.txt
學生id 姓名 年齡 按 | 分隔
1|小紅|22
2|王芳|24
3|李磊|22
4|王飛|30
student vo 類
@Data
public class StudentVo {
private Integer id;
private String name;
private Integer age;
public StudentVo(List<String> strList){
id = Integer.valueOf(strList.get(0));
name = strList.get(1);
age = Integer.valueOf(strList.get(2));
}
}
spark main 方法的初始化
SparkConf conf = new SparkConf()
.setAppName("MapReduceActionDemon")
.setMaster("local[1]");
JavaSparkContext sc = new JavaSparkContext(conf);
String studentfilePaht = "/Users/riverfan/mytest/spark/mrAction";
String scorefilePaht = "/Users/riverfan/mytest/spark/mrAction";
從文件轉化rdd
JavaRDD<String> rdd1 = sc.textFile(studentfilePaht);
map
1 map - 將原來RDD的每個數據項,使用map中用戶自定義的函數func進行映射,轉變爲一個新的元素,並返回一個新的RDD。
sc.textFile(studentfilePaht)
.map(t->{
List<String> strList = SPLITTER.splitToList(t);
return new StudentVo(strList);
}).foreach(t-> System.out.println(t));
輸出結果
StudentVo(id=1, name=語文, age=22)
StudentVo(id=1, name=化學, age=80)
StudentVo(id=2, name=語文, age=80)
StudentVo(id=3, name=數學, age=90)
StudentVo(id=3, name=應用, age=99)
2 filter(func)
使用函數func對原RDD中數據項進行過濾,將符合func中條件的數據項組成新的RDD返回
sc.textFile(studentfilePaht)
.map(t -> {
List<String> strList = SPLITTER.splitToList(t);
return new StudentVo(strList);
}).filter(t -> t.getAge() > 25)
.foreach(t -> System.out.println(t));
過來年紀大於25的學生
StudentVo(id=4, name=王飛, age=30)
3 flatMap(func)
類似於map,但是輸入數據項可以被映射到0個或多個輸出數據集合中,所以函數func的返回值是一個數據項集合而不是一個單一的數據項。??
sc.textFile(studentfilePaht)
.map(t -> {
List<String> strList = SPLITTER.splitToList(t);
return strList;
}).flatMap(t -> t.stream().iterator())
.foreach(t -> System.out.println(t));
數據由多個 list 壓扁 爲一個 list
1
小紅
22
2
王芳
24
3
李磊
22
4
王飛
30
mapPartitions
類似於map,但是該操作是在每個分區上分別執行,所以當操作一個類型爲T的RDD時func的格式必須是Iterator<T> => Iterator<U>。即mapPartitions需要獲取到每個分區的迭代器,在函數中通過這個分區的迭代器對整個分區的元素進行操作。
// 兩個分區
sc.textFile(studentfilePaht, 2)
.mapPartitions(t -> {
t.forEachRemaining(tt -> System.out.println(Thread.currentThread().getId() + "--> " + tt));
return t;
}).count();
結果如下
44--> 1|小紅|22
44--> 2|王芳|24
44--> 3|李磊|22
45--> 4|王飛|30
mapPartitionsWithIndex
類似於mapPartitions,但是需要提供給func一個整型值,這個整型值是分區的索引,所以當處理T類型的RDD時,func的格式必須爲(Int, Iterator<T>) => Iterator<U>。
sc.textFile(studentfilePaht, 2)
.mapPartitionsWithIndex((index,y)->{
System.out.println(Thread.currentThread().getId() + "--> index = " + index);
y.forEachRemaining(tt -> System.out.println(Thread.currentThread().getId() + "--> " + tt));
return y;
},false).count();
結果
44--> index = 0
44--> 1|小紅|22
44--> 2|王芳|24
44--> 3|李磊|22
45--> index = 1
45--> 4|王飛|30
sample(withReplacement, fraction, seed)
union(otherDataset)
返回原數據集和參數指定的數據集合並後的數據集。
JavaRDD<String> jrdd = sc.parallelize(Arrays.asList("hello","river"));
sc.textFile(studentfilePaht, 2)
.union(jrdd)
.collect()
.forEach(t-> System.out.println(t));
結果 將兩個數據聯合在一起
1|小紅|22
2|王芳|24
3|李磊|22
4|王飛|30
hello
river
intersection
返回兩個數據集的交集。
JavaRDD<String> jrdd = sc.parallelize(Arrays.asList("3|李磊|22","river"));
sc.textFile(studentfilePaht)
.intersection(jrdd)
.collect()
.forEach(t-> System.out.println(t));
3|李磊|22
未完待續