0

我正在尝试读取具有以下格式的行的文件。

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

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

java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.IntWritable

现在,虽然我明白这意味着什么,但我无法弄清楚如何将密钥读取为整数。如果我也读取密钥,代码运行Text良好。如果我错过了配置,我已经检查了代码中的任何地方,但这对我来说似乎很好。

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

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

conf.setOutputKeyClass(IntWritable.class);
conf.setOutputValueClass(Text.class);

我还检查了映射器类和方法(没有减速器)。是否KeyValueTextInputFormat可以将密钥仅作为文本读取?我无法理解我做错了什么。任何帮助将不胜感激。

谢谢,
EG

4

1 回答 1

2

源头KeyValueTextInputFormat它延伸自FileInputFormat<Text, Text>。这意味着您输入的 key 和 value 都应该是Text.

您可以修复实现您自己的问题,您可以按照此处描述的RecordReader方式进行建模,但可以扩展并相应地修改代码。KeyValueLineRecordRederRecordReader<IntWritable, Text>

当你有了你的RecordReader,你可以创建你自己的InputFormat并使用你的新的RecordReader,然后在你的主代码中你只需要InputFormat像这样设置你的新的:

conf.setInputFormatClass(KeyValueMyInputFormat.class);

如果您真的担心性能,我会推荐的另一种方法是您可以使用SequenceFileInputFormat. 这涉及将您的输入存储为 SequenceFiles,这意味着它将直接采用二进制格式。这避免了在您的情况下需要解析每一行的开销。您可以像这样使用这种格式:

conf.setInputFormatClass(SequenceFileInputFormat.class);
于 2013-01-22T05:35:58.050 回答