Java 如何为KeyValueTextInputFormat使用整数输入键
我正在尝试读取一个文件,其中包含以下格式的行 100,1:2:3 200,10:20:30 假设输入总是数字,我试图通过将输入键和值分别设置为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 现在,虽然我理解了它的含义,但我无法理解如何将键作为整数读取。如果我也将键读作文本,代码
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
,然后给你回复。谢谢