映射器的输入取决于使用的 InputFormat。InputFormat 负责读取传入的数据并将其调整为 Mapper 期望的任何格式。默认的 InputFormat 是TextInputFormat,它扩展了FileInputFormat<LongWritable, Text>
。
如果不更改 InputFormat,使用具有不同 Key-Value 类型签名的 Mapper<LongWritable, Text>
将导致此错误。如果您希望<Text, Text>
输入,则必须选择适当的 InputFormat。您可以在 Job setup 中设置 InputFormat:
job.setInputFormatClass(MyInputFormat.class);
就像我说的,默认设置为 TextInputFormat。
现在,假设您的输入数据是一堆用逗号分隔的换行符分隔记录:
如果您希望映射器的输入键为 ("A", "value1"), ("B", "value2"),则必须使用<Text, Text>
签名实现自定义 InputFormat 和 RecordReader。幸运的是,这很容易。这里有一个例子,可能还有一些例子漂浮在 StackOverflow 周围。
简而言之,添加一个扩展FileInputFormat<Text, Text>
类和一个扩展类RecordReader<Text, Text>
。重写该FileInputFormat#getRecordReader
方法,并让它返回您的自定义 RecordReader 的实例。
然后你必须实现所需的 RecordReader 逻辑。最简单的方法是在您的自定义 RecordReader 中创建LineRecordReader的实例,并将所有基本职责委托给该实例。在 getCurrentKey 和 getCurrentValue 方法中,您将通过调用逗号分隔文本内容LineRecordReader#getCurrentValue
并将其拆分来实现提取逗号分隔文本内容的逻辑。
最后,将您的新 InputFormat 设置为 Job InputFormat,如上面第二段之后所示。