Java spark中的各种范型接口Function的区别(持续更新中)
表格來自[2]
| Function<T, R> | T => R |
| DoubleFunction<T> | T => Double |
| PairFunction<T, K, V> | T => Tuple2<K, V> |
| FlatMapFunction<T, R> | T => Iterable<R> |
| DoubleFlatMapFunction<T> | T => Iterable<Double> |
| PairFlatMapFunction<T, K, V> | T => Iterable<Tuple2<K, V>> |
| Function2<T1, T2, R> | T1, T2 => R (function of two arguments) |
#------------------------------------------Function2用法---------------------------------------------------------------------------------------------
private static Function2 <Long, Long,Long> func2=new Function2<Long,Long,Long>()
{ private static final long serialVersionUID = 1L;
? ? public Long call(Long v1, Long v2) throws Exception
? ? {
? ? ? ? return v1+v2;
? ? }
};
?
// 第二步,對打上隨機前綴的key進行局部聚合。(調用)
? ? ? ? JavaPairRDD<String, Long> localAggrRdd = randomPrefixRdd.reduceByKey(func2);
? ? ? ? System.out.println("------------第2步-----localAggrRdd ----------------------");
? ? ? ? System.out.print(localAggrRdd.collect());
? ? ? ? System.out.println();
#--------------------------------------------------------PairFunction用法-----------------------------------------------------------------------------------------
// 首先將數據量比較小的RDD的數據,collect到Driver中來。List<Tuple2<Long,String>> rdd1Data = rdd1.collect();// 然后使用Spark的廣播功能,將小RDD的數據轉換成廣播變量,這樣每個Executor就只有一份RDD的數據。 // 可以盡可能節省內存空間,并且減少網絡傳輸性能開銷。final Broadcast<List<Tuple2<Long, String>>> rdd1DataBroadcast = sc.broadcast(rdd1Data);// 對另外一個RDD執行map類操作,而不再是join類操作。JavaPairRDD<Long, Tuple2<String, String>> joinedRdd = rdd2.mapToPair(new PairFunction<Tuple2<Long, String>, Long, Tuple2<String, String>>(){private static final long serialVersionUID = 1L;// 下面左側是返回的類型,右側是輸入的數據類型@Overridepublic Tuple2<Long, Tuple2<String, String>> call(Tuple2<Long, String> tuple) throws Exception{// 在算子函數中,通過廣播變量,獲取到本地Executor中的rdd1數據。List<Tuple2<Long, String>> rdd1Data = rdd1DataBroadcast.value();// 可以將rdd1的數據轉換為一個Map,便于后面進行join操作。Map<Long, String> rdd1DataMap = new HashMap<Long, String>();for (Tuple2<Long, String> data : rdd1Data){rdd1DataMap.put(data._1, data._2);}// 獲取當前RDD數據的key以及value。Long key = tuple._1;String value = tuple._2;// 從rdd1數據Map中,根據key獲取到可以join到的數據。String rdd1Value = rdd1DataMap.get(key);return new Tuple2<Long, Tuple2<String, String>>(key, new Tuple2<String, String>(value, rdd1Value));}});針對上面紛繁復雜的函數類型我們可以分析得到下面的規律(很多變量類型都是抄來抄去)
#---------------------------------------------------------------------------------------------------------------------------------------------
Reference:
[1]Spark的Java API例子詳解
[2]Function Classes
總結
以上是生活随笔為你收集整理的Java spark中的各种范型接口Function的区别(持续更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 节点+Executor+Core+Tas
- 下一篇: Java常用spark的pom.xml与