Fenêtre de process - Flink base représentative

flux de fenêtre

WindowedStream pur configuration API, l' exécution WindowedStream aux KeyedStream opérations de fusion sur une fenêtre et le fonctionnement.

 

agrégat

Par un champ ou une polymérisation par emplacement (tuple) convection / paquet

  agrégat de définition privée (aggregationType: AggregationType, field: String): DataStream [T] = { 
    Position val = fieldNames2Indices (getInputType (), Array (champ)) (0) 
    agrégat (aggregationType position) 
  } 

  def agrégat (aggregationType: AggregationType, Position: Int): DataStream [T] = { 

    val JStream = javaStream.asInstanceOf [JavaWStream [ Le produit, K, W]] 

    réducteur val = aggregationType correspondance { 
      cas AggregationType.SUM => 
        nouveau SumAggregator (position, jStream.getInputType, JStream. getExecutionEnvironment.getConfig) 

      cas _ => 
        nouvelle ComparableAggregator ( 
          position 
          jStream.getInputType, 
          aggregationType,
          vrai,
          jStream.getExecutionEnvironment.getConfig) 
    } 

    nouveau DataStream [Produit] (jStream.reduce (réducteur)). asInstanceOf [DataStream [T]] 
  }

fonction d'agrégation de classe abstraite

public abstract class AggregationFunction <T> outils ReduceFunction <T> { 
	finale statique privée de serialVersionUID = 1 litre; 

	/ ** 
	 * types d'agrégation qui peuvent être utilisés sur un flux fenêtré ou flux claveté. 
	 * / 
	Public enum AggregationType { 
		SUM, MIN, MAX, MINBY, MAXBY, 
	} 
}

Mettre en œuvre la classe abstraite a SumAggregator, ComparableAggregator

Par exemple SumAggregator, ReduceFunction implémente l'interface (par héritage sur AggregationFunction classe abstraite)

SumAggregator public class <T> étend AggregationFunction <T> { 

	private static finale longue serialVersionUID = 1 litre; 

	finale privée FieldAccessor <T, Objet> fieldAccessor; 
	finale privée sommateur SumFunction; 
	finale privée TypeSerializer <T> sérialiseur; 
	finale privée isTuple booléenne; 

	SumAggregator publique (int pos Les, TypeInformation <T> TYPEINFO, config ExecutionConfig) { 
		fieldAccessor = FieldAccessorFactory.getAccessor (TYPEINFO, pos, config); 
		additionneur = SumFunction.getForClass (fieldAccessor.getFieldType () getTypeClass ().); 
		si (TYPEINFO instanceof TupleTypeInfo) { 
			isTuple = true; 
			sérialiseur = null; 
		} Else { 
			isTuple = false;
			this.serializer = typeInfo.createSerializer (config); 
		} 
	} 

	SumAggregator publique (champ Chaîne, TypeInformation <T> TYPEINFO, ExecutionConfig config) { 
		fieldAccessor = FieldAccessorFactory.getAccessor (TYPEINFO, champ, config); 
		additionneur = SumFunction.getForClass (fieldAccessor.getFieldType () getTypeClass ().); 
		si (TYPEINFO instanceof TupleTypeInfo) { 
			isTuple = true; 
			sérialiseur = null; 
		} Else { 
			isTuple = false; 
			this.serializer = typeInfo.createSerializer (config); 
		} 
	} 

	@Override 
	@SuppressWarnings ( "sans contrôle") 
	T publique de réduire (T valeur1, T valeur2) throws Exception { 
		if (isTuple) { 
			résultat Tuple = ((Tuple) valeur1) .copy ();
			retour fieldAccessor.set ((T) suite, adder.add (fieldAccessor.get (valeur1), fieldAccessor.get (valeur2))); 
		} Else { 
			T result = serializer.copy (valeur1); 
			retour fieldAccessor.set (résultat, adder.add (fieldAccessor.get (valeur1), fieldAccessor.get (valeur2))); 
		} 
	} 
}

méthode de dérivation commune

somme

résumé def (position: Int): DataStream [T] = agrégat (AggregationType.SUM position)

maxBy

def maxBy (position: Int): DataStream [T] = agrégat (AggregationType.MAXBY position)

Exemple d'extrait de code

somme

val chiffres: DataStream [(String, Int)] = text.flatMap (_ toLowerCase () split ( "\\ W +")..) 
  .filter (_ non vide). 
  .map ((_, 1)) 
  .keyBy ( 0) 
  .countWindow (windowSize, SlideSize) 
  .sum (1)

maxBy

val chiffres: DataStream [(String, Int)] = text.flatMap (_ toLowerCase () split ( "\\ W +")..) 
  .filter (_ non vide). 
  .map ((_, 1)) 
  .keyBy ( 0) 
  .countWindow (windowSize, SlideSize) 
  .maxBy (1)

 

réduire

La même chose est appliqué séparément pour le gestionnaire fixé un élément clé de

réduire def (fonction: (T, T) => T): DataStream [T] = { 
    if (fonction == null) { 
      throw new NullPointerException ( "Réduire la fonction ne doit pas être null") 
    } 
    val = cleanFun propre (fonction ) 
    val réducteur = new ScalaReduceFunction [T] (cleanFun) 
    réduire (réducteur) 
  }

Interface également des outils ReduceFunction

ScalaReduceFunction de classe finale [T] (privé [ce] fonction val: (T, T) => T) 
    étend ReduceFunction [T] { 
  
  @throws (classof [Exception]) 
  override réduire def (a: T, b: T): T = { 
    fonction (a, b) 
  } 
}

appel Source

// fichier: org.apache.flink.streaming.api.datastream.WindowedStream 

publique <R> SingleOutputStreamOperator <R> réduire ( 
		ReduceFunction <T> reduceFunction, 
		fenêtrage <T, R, K, W> function, 
		TypeInformation <R> resultType ) { 

	if (reduceFunction instanceof RichFunction) { 
		throw new UnsupportedOperationException ( "reduceFunction de réduire ne peut pas être un RichFunction."); 
	} 

	// nettoyer les fermetures 
	fonctionnent = input.getExecutionEnvironment () propre (fonction). 
	reduceFunction = input.getExecutionEnvironment () propre (reduceFunction). 

	Chaîne finale Opname = generateOperatorName (windowAssigner, détente, expulseur, reduceFunction, fonction); 
	KeySelector <T, K> = keySel entrée.

	OneInputStreamOperator <T, R> opérateur; 

	si (expulseur! = null) { 
		@SuppressWarnings ({ "non vérifiées", "rawtypes"}) 
		TypeSerializer <StreamRecord <T >> streamRecordSerializer = 
			(TypeSerializer <StreamRecord <T >>) nouvelle StreamElementSerializer (input.getType (). createSerializer ( . getExecutionEnvironment () getConfig ())); 

		ListStateDescriptor <StreamRecord <T >> stateDesc = 
			nouveau ListStateDescriptor <> ( "fenêtres contenu", streamRecordSerializer); 

		opérateur = 
			nouveau EvictingWindowOperator <> (windowAssigner, 
				windowAssigner.getWindowSerializer (getExecutionEnvironment (). getConfig ()), 
				keySel, 
				input.getKeyType ().
				nouveau InternalIterableWindowFunction <> (nouveau ReduceApplyWindowFunction <> (reduceFunction, fonction)), 
				déclenchement, 
				expulseur, 
				allowedLateness, 
				lateDataOutputTag); 

	} Else { 
		ReducingStateDescriptor <T> stateDesc = new ReducingStateDescriptor <> ( "fenêtres contenu", 
			reduceFunction, 
			input.getType () createSerializer (getExecutionEnvironment () getConfig ())..); 

		opérateur = 
			nouveau WindowOperator <> (windowAssigner, 
				windowAssigner.getWindowSerializer (getExecutionEnvironment (). getConfig ()), 
				keySel, 
				input.getKeyType (). createSerializer (getExecutionEnvironment (). getConfig ()), 
				stateDesc,
				nouveau InternalSingleValueWindowFunction <> (fonction),
				déclenchement, 
				allowedLateness, 
				lateDataOutputTag); 
	} 

	Input.transform de retour (opname, resultType, opérateur); 
}

Exemple d'extrait de code

stream.keyBy (0) 
  .timeWindow (Time.of (2500, TimeUnit.MILLISECONDS), Time.of (500, TimeUnit.MILLISECONDS)) 
  .reduce ((valeur1; valeur2) => (value1._1, value1._2 + value2._2)) 
  .addSink (nouveau SinkFunction [(long, long)] {})

 

processus

 233

 

appliquer

233

Je suppose que tu aimes

Origine www.cnblogs.com/lemos/p/12640664.html
conseillé
Classement