1. 程式人生 > 實用技巧 >Flink開發_Flink中的函式介面

Flink開發_Flink中的函式介面

org.apache.flink.api.common.functions
  group
  reduce
  combine

1.轉換Transformation

public interface FilterFunction<T> extends Function, Serializable {
    boolean filter(T var1) throws Exception;
}

public interface MapFunction<T, O> extends Function, Serializable {
    O map(T var1) throws Exception;
}
public interface FlatMapFunction<T, O> extends Function, Serializable {
    void flatMap(T var1, Collector<O> var2) throws Exception;
}

2.聚合

 Flink在reduce之前大量使用了Combine操作。
 Combine可以理解為是在map端的reduce的操作,對單個map任務的輸出結果資料進行合併的操作
 combine是對一個map的
 map函式操作所產生的鍵值對會作為combine函式的輸入,
 經combine函式處理後再送到reduce函式進行處理,
   減少了寫入磁碟的資料量,同時也減少了網路中鍵值對的傳輸量
---------------------------------------------------------------
 public interface CombineFunction<IN, OUT> extends Function, Serializable {
 OUT combine(Iterable<IN> var1) throws Exception;
 }

public interface ReduceFunction<T> extends Function, Serializable {
    T reduce(T var1, T var2) throws Exception;
}

public interface AggregateFunction<IN, ACC, OUT> extends Function, Serializable {
    ACC createAccumulator();
    ACC add(IN var1, ACC var2);
	ACC merge(ACC var1, ACC var2);
    OUT getResult(ACC var1);   
}
----------------------------------------------------------------------

3.關聯

--Join操作DataStream時只能用在window中,和cogroup操作一樣
------關聯---------這種 JoinFunction 和 FlatJoinFunction 與 MapFunction 和 FlatMapFunction 的關係類似------------
public interface JoinFunction<IN1, IN2, OUT> extends Function, Serializable {
    OUT join(IN1 var1, IN2 var2) throws Exception;
}

public interface FlatJoinFunction<IN1, IN2, OUT> extends Function, Serializable {
    void join(IN1 var1, IN2 var2, Collector<OUT> var3) throws Exception;
}

public interface CrossFunction<IN1, IN2, OUT> extends Function, Serializable {
OUT cross(IN1 var1, IN2 var2) throws Exception;
}
-- CoGroup  兩個資料流/集合按照key進行group,然後將相同key的資料進行處理,
--- 但是它和join操作稍有區別,它在一個流/資料集中沒有找到與另一個匹配的資料還是會輸出。
--  如果是 DataStream中  則需要在window中使用
--- 如果在Dataser中 
public interface CoGroupFunction<IN1, IN2, O> extends Function, Serializable {
    void coGroup(Iterable<IN1> var1, Iterable<IN2> var2, Collector<O> var3) throws Exception;
}

4.分組

-- 分組reduce,即 GroupReduce  GroupReduceFunction
-- 這與Reduce的區別在於使用者定義的函式會立即獲得整個組。在組的所有元素上使用Iterable呼叫該函式,
並且可以返回任意數量的結果元素
public interface GroupReduceFunction<T, O> extends Function, Serializable {
    void reduce(Iterable<T> var1, Collector<O> var2) throws Exception;
}

-- 使group-reduce函式可組合,它必須實現GroupCombineFunction介面
-- GroupCombine轉換是可組合GroupReduceFunction中組合步驟的通用形式。
它在某種意義上被概括為允許將輸入型別I組合到任意輸出型別O.
-- 相反,GroupReduce中的組合步驟僅允許從輸入型別I到輸出型別I的組合。
這是因為reduce步驟中, GroupReduceFunction 期望輸入型別為I.
public interface GroupCombineFunction<IN, OUT> extends Function, Serializable {
    void combine(Iterable<IN> var1, Collector<OUT> var2) throws Exception;
}

5.分割槽

-----------------------------------------------
public interface Partitioner<K> extends Serializable, Function {
    int partition(K var1, int var2);
}
 
public interface MapPartitionFunction<T, O> extends Function, Serializable {
    void mapPartition(Iterable<T> var1, Collector<O> var2) throws Exception;
}

6.其他

其他

Spark SQL UDAF與Flink的 aggreagte介面

  Spark SQL的UDAF  UserDefinedAggregateFunction
  inputSchema  bufferSchema  dataType
  initialize  update  merge  evaluate

  Flink:
     interface AggregateFunction
	 <IN, ACC, OUT>
    createAccumulator, add,merge;getResult;   
   }