У меня есть файл продаж с информацией, такой как название магазина, местоположение, цена продажи, название продукта и т. Д. Формат файла указан ниже,
2012-01-01 09:00 San Jose Men's Clothing 214.05 Amex
2012-01-01 09:00 Fort Worth Women's Clothing 153.57 Visa
2012-01-01 09:00 San Diego Music 66.08 Cash
2012-01-01 09:00 Pittsburgh Pet Supplies 493.51 Discover
2012-01-01 09:00 Omaha Children's Clothing 235.63 MasterCard
2012-01-01 09:00 Stockton Men's Clothing 247.18 MasterCard
Я хотел бы написать карту.сократить количество рабочих мест, чтобы найти распределение продаж по категориям товаров во всех наших магазинах.Мой код (включая маппер и редуктор) приведен ниже,
public final class P1Q1 {
public static final class P1Q1Map extends Mapper<LongWritable, Text, Text, DoubleWritable> {
private final Text word = new Text();
public final void map(final LongWritable key, final Text value, final Context context)
throws IOException, InterruptedException {
final String line = value.toString();
final String[] data = line.trim().split("\t");
if (data.length == 6) {
final String product = data[3];
final double sales = Double.parseDouble(data[4]);
word.set(product);
context.write(word, new DoubleWritable(sales));
}
}
}
public static final class P1Q1Reduce extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
public final void reduce(final Text key, final Iterable<DoubleWritable> values, final Context context)
throws IOException, InterruptedException {
double sum = 0.0;
for (final DoubleWritable val : values) {
sum += val.get();
}
context.write(key, new DoubleWritable(sum));
}
}
public final static void main(final String[] args) throws Exception {
final Configuration conf = new Configuration();
final Job job = new Job(conf, "P1Q1");
job.setJarByClass(P1Q1.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
job.setMapperClass(P1Q1Map.class);
job.setCombinerClass(P1Q1Reduce.class);
job.setReducerClass(P1Q1Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}
Ответ, который дает код, является неправильным и не соответствует результатам Udacity.
Кто-нибудь знает, правильная ли это мысль и как это сделать?
Примечание
Я получаю совершенно неверный результат в выходном файле
Baby 5.749180844000035E7
Books 5.745075790999787E7
CDs 5.741075304000156E7
Cameras 5.7299046639999785E7
Children's Clothing 5.762482094000117E7
Computers 5.7315406319999576E7
Consumer Electronics 5.745237412999948E7
Crafts 5.7418154499999225E7
DVDs 5.764921213999939E7
Garden 5.7539833110000335E7
Health and Beauty 5.748158956000019E7
Men's Clothing 5.76212790400011E7
Music 5.749548970000038E7
Pet Supplies 5.71972502400004E7
Sporting Goods 5.7599085889999546E7
Toys 5.746347710999843E7
Video Games 5.7513165580000155E7
Women's Clothing 5.74344489699993E7
Я подумал, что если закомментировать комбинатор, это будет хорошо.Я сделал это и не изменил результат.
job.setCombinerClass(P1Q1Reduce.class);
Я предоставил код, а ссылка purchases.txt
здесь здесь .Если кто-то попытается решить проблему и успешно отправит в Udacity , пожалуйста, дайте мне знать.