spark學習-20-Spark的sample理解
阿新 • • 發佈:2019-02-13
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資料不是很重要的話,可以過濾掉,這樣就解決了資料傾斜。