Java Mapper:查找同时购买商品ID 21和27的客户数量

时间:2018-04-26 03:32:00

标签: java

我想为零售数据集创建一个map函数,输入键为长整数偏移量,输入值为文本行。映射的输出键是文本Both_21_27,输出值是常量整数值1。

在地图中,应创建两个布尔变量item_21和item_27并将其初始化为false。将值更改为string后,StringTokenizer用于将字符串转换为标记。

对于每个标记,必须迭代每个标记以查看它是否与21或27匹配。如果存在匹配,则相应的布尔变量将更改为true。切换条件可用于检查。

在遍历所有标记之后,两个布尔变量都应该为真。如果两个布尔变量都为false或者一个为true且一个为false,则返回;语句应该用于跳过事务并继续下一个事务。

示例零售数据集如下所示:



2 7 15 21 32 41 
5 14 19 21 25 27 45 57 62 75 80 
1 3 7 15 19 21 26 27 35 44 54 
2 9 16 24 35 41 49 57 68 72 88 
4 23 31 33 42 45 67 73 92 
9 12 18 21 22 24 27 43 74 
15 19 45 47 53 58 64 79 83 94 99 107
3 7 15 17 21 23 26 27 33 42 44 47 49 55 62 77 82 




这是我到目前为止所尝试的内容:



import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;


public class RetailMapper
  extends Mapper<LongWritable, Text, Text, IntWritable> {

  private Text Both_21_27 = new Text();
  private final static IntWritable one = new IntWritable(1);
  
  @Override
  public void map(LongWritable key, Text value, Context context)
      throws IOException, InterruptedException {
    
	boolean item_21 = false;
	boolean item_27 = false;
    StringTokenizer item = new StringTokenizer(value.toString());
	
	while (item.hasMoreTokens()) {
	Both_21_27.set(item.nextToken());
	context.write(Both_21_27, one);
	}
	switch(item) {
		case 21 :
			item_21 = true;
			break;
		case 27 :
			item_27 = true;
			break;
	}
    if (item_21 = true && item_27 = true) {
      context.write(Both_21_27, one);
	else return;
	}
}

  }
&#13;
&#13;
&#13;

我坚持使用这个地图功能。任何帮助,建议和建议?

1 个答案:

答案 0 :(得分:0)

我认为您需要将switch阻止移动到while循环。

public void map(LongWritable key, Text value, Context context)
      throws IOException, InterruptedException {

    boolean item_39 = false;
    boolean item_48 = false;
    StringTokenizer item = new StringTokenizer(value.toString());

    while (item.hasMoreTokens()) {
    Both_39_48.set(item.nextToken());
    context.write(Both_39_48, one);
    switch((Integer)item.nextElement()) { // use nextElement and convert to int
        case 39 :
            item_39 = true;
            break;
        case 48 :
            item_48 = true;
            break;
    }
    }

    if (item_39 && item_48) {
      context.write(Both_39_48, one);
    }
    else return;

}