| 

.NET C# Java Javascript Exception

9

Im zweiten Teil meiner kleinen Serie der MapReduce Entwurfsmustern für Microsoft HDInsight möchte ich ein weiteres Beispiel für eine Numerische Aggregation vorstellen. Diesmal geht es um die Berechnung von Durchschnittswerten...

Der Beitrag MapReduce Entwurfsmuster – Numerische Aggregation (Average) erschien zuerst auf Sascha Dittmann.

MapReduce Entwurfsmuster - DurchschnittswerteIm zweiten Teil meiner kleinen Serie der MapReduce Entwurfsmustern für Microsoft HDInsight möchte ich ein weiteres Beispiel für eine Numerische Aggregation vorstellen.
Diesmal geht es um die Berechnung von Durchschnittswerten…

Im ersten Teil dieser Serie hatte ich ein Beispiel für einen Min/Max/Count MapReduce-Algorithmus vorgestellt.

Diesmal möchte ich die Sammlung um ein Beispiel für eine Durchschnittswertberechnung erweitern.

 

Beispiel "Average"

Bei diesem Beispiel soll die durchschnittliche Kommentarlänge pro Stunde errechnet werden.

Hierzu extrahiert die Mapper-Funktion die Werte der CreationDate- und Text-Attribute der XML-Quelle und gibt den Stunden-Wert, sowie die Textlängem als Key/Value-Paare zurück:

public class AverageMapper 
 : JsonOutMapperBase<CountAverageData>
{
 public override void Map(string inputLine, 
 JsonMapperContext<CountAverageData> context)
 {
 var parsed = XmlUtils.ParseXml(inputLine);

 if (parsed == null 
 || !parsed.ContainsKey("CreationDate") 
 || !parsed.ContainsKey("Text"))
 {
 context.CoreContext.IncrementCounter(
 "Average Mapper", "Invalid Rows", 1);
 return;
 }

 DateTime creationDate;
 if (!DateTime.TryParse(parsed["CreationDate"], out creationDate))
 {
 context.CoreContext.IncrementCounter(
 "Average Mapper", "Invalid Creation Dates", 1);
 return;
 }

 var text = parsed["Text"];

 context.EmitKeyValue(
 creationDate.Hour.ToString(CultureInfo.InvariantCulture),
 new CountAverageData
 {
 Average = text.Length,
 Count = 1,
 });
 }
}

 

Die Combiner- und Reducer-Funktionen aggregieren anschließend die entsprechenden Werte.

Damit die Werte durch die Combiner-Funktion nicht verfälscht werden, muss die Summe mittels der Anzahl der Datensätze rekonstruiert werden.

public class AverageCombiner 
 : JsonInOutReducerCombinerBase<CountAverageData, CountAverageData>
{
 public override void Reduce(string key, 
 IEnumerable<CountAverageData> values, 
 JsonReducerCombinerContext<CountAverageData> context)
 {
 float sum = 0;
 float count = 0;

 foreach (var value in values)
 {
 sum += value.Count * value.Average;
 count += value.Count;
 }

 context.EmitKeyValue(key, new CountAverageData
 {
 Average = sum / count,
 Count = count,
 });
 }
}

 

Der Reducer liefert erneut die Ausgabewerte – zur späteren Weiterverarbeitung – im Tab-getrennten Format zurück.

public class AverageReducer
 : JsonInReducerCombinerBase<CountAverageData>
{
 public override void Reduce(string key, 
 IEnumerable<CountAverageData> values, 
 ReducerCombinerContext context)
 {
 float sum = 0;
 float count = 0;

 foreach (var value in values)
 {
 sum += value.Count * value.Average;
 count += value.Count;
 }

 context.EmitKeyValue(key, new CountAverageData
 {
 Average = sum / count,
 Count = count,
 }.ToString());
 }
}

 

public class CountAverageData
{
 public float Average { get; set; }
 public float Count { get; set; }

 public override string ToString()
 {
 return String.Format("{0}t{1}", Average, Count);
 }
}

 

Der Beitrag MapReduce Entwurfsmuster – Numerische Aggregation (Average) erschien zuerst auf Sascha Dittmann.

.net microsoft-azure csharp sql-server cloud-computing nosql hadoop hdinsight mapreduce
Schreibe einen Kommentar:
Themen:
mapreduce hdinsight hadoop nosql cloud-computing sql-server csharp microsoft-azure .net
Entweder einloggen... ...oder ohne Wartezeit registrieren
Benutzername
Passwort
Passwort wiederholen
E-Mail
TOP TECHNOLOGIES CONSULTING GmbH