1. 程式人生 > >spark學習-20-Spark的sample理解

spark學習-20-Spark的sample理解

1.語法(java):

JavaPairRDD<K,V> sample(boolean withReplacement,
                    double fraction)

JavaPairRDD<K,V> sample(boolean withReplacement,
                    double fraction,
                    long seed)

2.說明:

對RDD進行抽樣,其中引數withReplacement為true時表示抽樣之後還放回,可以被多次抽樣,false表示不放回;fraction表示抽樣比例;seed為隨機數種子,比如當前時間戳

3.程式演示

package mysample;

import java.util.Arrays;
import java.util.List;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;





public class Sample {
    public static void main(String[] args) {

        SparkSession spark= SparkSession.builder
() .appName("lcc_java_read_hbase_register_to_table") .master("local[*]") .getOrCreate(); JavaSparkContext sc = new JavaSparkContext(spark.sparkContext()); List<Integer> datas = Arrays.asList(1, 2, 3, 4,5,6,7,8
,9,10); JavaRDD<Integer> dataRDD = sc.parallelize(datas); JavaRDD<Integer> sampleRDD = dataRDD.sample(false, 0.5, System.currentTimeMillis()); System.out.println("==========sampleRDD=====1=========="); sampleRDD.foreach(v -> System.out.println(v)); JavaRDD<Integer> sampleRDD2 = dataRDD.sample(true, 0.5, System.currentTimeMillis()); System.out.println("==========sampleRDD=====2=========="); sampleRDD2.foreach(v -> System.out.println(v)); sc.close(); } }

輸出結果

==========sampleRDD=====1==========
5
8
3
==========sampleRDD=====2==========
7
7
5
8

小結:每次執行列印的都不相同,相當於java中的隨機函式,場景類似與,黑盒子裡拿紅白球,
有兩種拿法一種,
拿出來後在放進去,讓別人拿,可能相同,dataRDD.sample(false, 0.5, System.currentTimeMillis());
拿出來後不放進去,讓別人拿,絕對不相同 dataRDD.sample(true, 0.5, System.currentTimeMillis());

4.測試第二個引數

JavaRDD<Integer> sampleRDD = dataRDD.sample(false, 0.1, System.currentTimeMillis());
JavaRDD<Integer> sampleRDD2 = dataRDD.sample(true, 0.1, System.currentTimeMillis());

第一次執行
==========sampleRDD=====1==========
9
==========sampleRDD=====2==========
第二次執行
==========sampleRDD=====1==========
9
10
==========sampleRDD=====2==========
1
10


JavaRDD<Integer> sampleRDD = dataRDD.sample(false, 0.6, System.currentTimeMillis());
JavaRDD<Integer> sampleRDD2 = dataRDD.sample(true, 0.6, System.currentTimeMillis());
第一次執行
==========sampleRDD=====1==========
6
8
9
10
1
3
4

第二次執行
==========sampleRDD=====2==========
2
4
4
6
7
8
10
1
3
4
5
==========sampleRDD=====2==========
1
2
4
5
6
8
8
8
9

這個有什麼用呢?

在資料傾斜的時候,我們那麼多資料如果想知道那個key傾斜了,就需要我們取樣獲取這些key,如果這些key資料不是很重要的話,可以過濾掉,這樣就解決了資料傾斜。