我想为零售数据集创建一个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;
我坚持使用这个地图功能。任何帮助,建议和建议?
答案 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;
}