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>ます。つまり、入力のキーと値の両方がText.

hereの説明に従ってRecordReaderモデル化できる独自の実装を修正できますが、代わりに拡張し、それに応じてコードを変更します。KeyValueLineRecordRederRecordReader<IntWritable, Text>

を持っている場合はRecordReader、独自のものを作成しInputFormatて new を使用できます。次に、メイン コードで new を次のようRecordReaderに設定する必要があります。InputFormat

conf.setInputFormatClass(KeyValueMyInputFormat.class);

パフォーマンスが本当に心配な場合に推奨する別のアプローチは、 を使用できることSequenceFileInputFormatです。これには、入力を SequenceFiles として保存することが含まれます。つまり、直接バイナリ形式になります。これにより、必要に応じてすべての行を解析するオーバーヘッドが回避されます。この形式は次のように使用できます。

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