地图如何知道什么是关键

时间:2016-10-13 09:05:29

标签: java hadoop mapreduce

我有一个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"));
甚至以为我从没用过那把钥匙。

1 个答案:

答案 0 :(得分:0)

您必须实现自定义RecordReader。

例如: Hadoop为TextInputFormat实现了一个记录阅读器。它读取文本文件行。它为每条记录发出的密钥是读取的行的字节偏移量(作为LongWritable),该值是直到终止的行的内容&#39; \ n&#39;字符(作为文本对象)。

Refer this to develop custom record reader