spark RDD - action

通過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

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章