Java 如何为KeyValueTextInputFormat使用整数输入键

Java 如何为KeyValueTextInputFormat使用整数输入键,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在尝试读取一个文件,其中包含以下格式的行 100,1:2:3 200,10:20:30 假设输入总是数字,我试图通过将输入键和值分别设置为intwriteable和Text来读取文件。但是当我运行它时,我得到以下错误: java.lang.ClassCastException:org.apache.hadoop.io.Text不能强制转换为org.apache.hadoop.io.IntWritable 现在,虽然我理解了它的含义,但我无法理解如何将键作为整数读取。如果我也将键读作文本,代码

我正在尝试读取一个文件,其中包含以下格式的行

100,1:2:3 200,10:20:30

假设输入总是数字,我试图通过将输入键和值分别设置为
intwriteable
Text
来读取文件。但是当我运行它时,我得到以下错误:

java.lang.ClassCastException:org.apache.hadoop.io.Text不能强制转换为org.apache.hadoop.io.IntWritable

现在,虽然我理解了它的含义,但我无法理解如何将键作为整数读取。如果我也将键读作
文本
,代码运行良好。如果我错过了配置,我会检查代码中的所有地方,但对我来说似乎没问题

conf.set("mapred.textoutputformat.separator", "|");

conf.setInputFormatClass(KeyValueTextInputFormat.class);
conf.setOutputFormatClass(TextOutputFormat.class);

conf.setOutputKeyClass(IntWritable.class);
conf.setOutputValueClass(Text.class);
我还检查了mapper类和方法(没有reducer)。是不是
KeyValueTextInputFormat
可以将键作为唯一文本读取?我无法理解我做错了什么。任何帮助都将不胜感激

谢谢,
例如,查看
KeyValueTextInputFormat
,它从
FileInputFormat
扩展而来。这意味着输入的键和值都应该是
Text

您可以通过实现自己的
RecordReader
来解决这个问题,您可以在所述的
KeyValueLineRecordReder
之后对其进行建模,但可以从
RecordReader
进行扩展,并相应地修改代码

当您拥有
RecordReader
时,您可以创建自己的
InputFormat
并使用新的
RecordReader
,然后在主代码中只需设置新的
InputFormat
,如下所示:

conf.setInputFormatClass(KeyValueMyInputFormat.class);
conf.setInputFormatClass(SequenceFileInputFormat.class);
如果您真的担心性能,我推荐的另一种方法是使用
SequenceFileInputFormat
。这涉及到将您的输入存储为SequenceFile,这意味着它将直接采用二进制格式。这避免了在您的案例中解析每一行所需的开销。您可以使用如下格式:

conf.setInputFormatClass(KeyValueMyInputFormat.class);
conf.setInputFormatClass(SequenceFileInputFormat.class);

我会尝试
SequenceFileInputFormat
,然后给你回复。谢谢