Um MapReduce auszuführen, müssen Sie die Mapper und Reducer/Combiner-Typen übergeben, daher müssen sie parameterlosen Konstruktor haben. Also gibt es keine Möglichkeit, dass Abhängigkeiten den Mapper- oder Reducer-Entitäten über die Konstruktor- oder Mapper-Methode Eigenschaften hinzufügen können.C# HDInsight MapReduce übergeben Argumente an Mapper
Ich versuche zu vermeiden, mehrere Mapper zu erstellen, die genau das gleiche tun nur, dass sie nach einer anderen Eigenschaft in einer JSON-String-Eingabe suchen.
Von msdn Blog zur Veranschaulichung übernommen. Der Mapper konvertiert die Eingabezeile, die wir als JSON-String annehmen, in ein Objekt. Trifft "eine Eigenschaft" aus, um eine Karte zu erstellen. Das Problem besteht darin, wie wir dieses "eine Eigenschaft" einfügen können, so dass wir das Verhalten des Mappers steuern können, ohne dass wir mehrere Implementierungen davon erstellen müssen.
public class MySimpleMapper : MapperBase
{
public override void Map(string inputLine, MapperContext context)
{
//interpret the incoming line as an integer value
SomeObject obj = JsonConvert.Serialize<SomeObject>(inputLine);
int value = obj.Properties["some property"];
//determine whether value is even or odd
string key = (value % 2 == 0) ? “even” : “odd”;
//output key assignment with value
context.EmitKeyValue(key, value.ToString());
}
}
Die Reduziererklasse, die die zugeordneten Objekte vom Mapper übernimmt.
public class MySimpleReducer : ReducerCombinerBase
{
public override void Reduce(
string key, IEnumerable<string> values, ReducerCombinerContext context
)
{
//initialize counters
int myCount = 0;
int mySum = 0;
//count and sum incoming values
foreach (string value in values)
{
mySum += int.Parse(value);
myCount++;
}
//output results
context.EmitKeyValue(key, myCount + “t” + mySum);
}
Beachten Sie, wie wir es der Art von Mapper und Reducer geben, daher muss es einen parameterlosen Konstruktor geben.
//output results
context.EmitKeyValue(key, myCount + “t” + mySum);
}
//establish job configuration
HadoopJobConfiguration myConfig = new HadoopJobConfiguration();
myConfig.InputPath = “/demo/simple/in”;
myConfig.OutputFolder = “/demo/simple/out”;
//connect to cluster
Uri myUri = new Uri(“http://localhost”);
string userName = “hadoop”;
string passWord = null;
IHadoop myCluster = Hadoop.Connect(myUri, userName, passWord);
//execute mapreduce job
MapReduceResult jobResult =
myCluster.MapReduceJob.Execute<MySimpleMapper, MySimpleReducer>(myConfig);
Hallo, können Sie einen Beispielcode hinzufügen, um Ihre Frage zu veranschaulichen? – benjguin