我有一个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"));
甚至以为我从来没有用过那个 key 。
最佳答案
您将必须实现自定义RecordReader。
例如:
Hadoop为TextInputFormat实现了一个记录读取器,它读取文本文件的行。它为每个记录发出的键是读取的行的字节偏移量(作为LongWritable),值是直到终止符'\ n'的行的内容(作为Text对象)。
Refer this to develop custom record reader