Для выполнения mapreduce вам необходимо передать типы карт и редукторов/объединителей, следовательно, они должны иметь конструктор без параметров. Таким образом, вы никак не можете вводить какие-либо свойства объектам mapper или редуктора через конструктор или метод сопоставления?C# HDInsight MapReduce передать аргументы в mapper
Я пытаюсь избежать создания нескольких картографов, которые делают то же самое, только если они ищут другое свойство в вводе строки json.
Взято из блога msdn для иллюстрации. Преобразователь преобразует строку ввода, которую мы предполагаем как строку json для объекта. Выбирает «некоторое свойство» для отображения. Проблема здесь в том, как мы можем вставить это «некоторое свойство», чтобы мы могли управлять поведением преобразователя, не создавая для него нескольких его реализаций.
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());
}
}
Класс редуктора, который отображает отображаемые объекты из картографа.
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);
}
Обратите внимание, как мы даем ему тип преобразователя и редуктора, следовательно, должен быть параметром менее конструктор.
//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);
Привет, можете ли вы добавить пример кода для иллюстрации вашего вопроса? – benjguin