我有一个csv文件
文本|文本|键|文本|文本
文|文|关键|文|文
文|文|关键|文|文
文本|文本|键|文本|文本
和一个java文件
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
public class MTransactionPerDay implements Mapper<WritableComparable, Text, Text, Text>{
public void map(WritableComparable key, Text value, OutputCollector<Text, Text> outputCollector, Reporter reporter) throws IOException {
}
我的问题是。如何告诉map方法第三个字段是关键?
修改
这解决了我的问题
public void map(WritableComparable key, Text value, OutputCollector<Text, Text> outputCollector, Reporter reporter) throws IOException {
//split string
String[] row = value.toString().split("[|]");
//define key value pairs
Text keyString = new Text(row[3]);
Text valueString = new Text(row[2]);
//result
outputCollector.collect(keyString, valueString);
}
但提出了另一个问题。我知道map接受一个文件并返回键/值对。这对于 WritableComparable密钥是什么?
事实上我写了一个测试
@Test
public void testMapReduce() {
System.setProperty("hadoop.home.dir", "C:\\WorkSpace\\");
mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000001|20160125204123"));
mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000001|20160125204123"));
mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000002|20160125204123"));
mapReduceDriver.addOutput(new Text("9050000001"), new IntWritable(2));
mapReduceDriver.addOutput(new Text("9050000002"), new IntWritable(1));
mapReduceDriver.runTest();
}
并且必须在那里添加
mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000001|20160125204123"));
甚至以为我从没用过那把钥匙。
答案 0 :(得分:0)
您必须实现自定义RecordReader。
例如: Hadoop为TextInputFormat实现了一个记录阅读器。它读取文本文件行。它为每条记录发出的密钥是读取的行的字节偏移量(作为LongWritable),该值是直到终止的行的内容&#39; \ n&#39;字符(作为文本对象)。