2012-02-09 4 views
13

新しいAPI(apache.hadoop.mapreduce.KeyValueTextInputFormat)では、キーと値を区切るためにタブ(デフォルト)以外の区切り記号(デリミタ)を指定する方法を説明します。Hadoop-.20 APIでKeyValueTextInputFormatセパレータを指定する方法は?

サンプル入力:

one,first line 
two,second line 

出力リレー必須:これはセパレータとしてタブの正常に動作している

Job job = new Job(conf, "Sample"); 

    job.setInputFormatClass(KeyValueTextInputFormat.class); 
    KeyValueTextInputFormat.addInputPath(job, new Path("/home/input.txt")); 

Key : one 
Value : first line 
Key : two 
Value : second line 

私のようにKeyValueTextInputFormatを指定しています。

+0

受け入れ答えは、それは私のために正常に動作罰金 –

+0

@SreeVeniが機能していません。 –

答えて

11

新しいAPIでは、mapreduce.input.keyvaluelinerecordreader.key.value.separator構成プロパティを使用する必要があります。

は、ここに例です:デフォルトでは

+0

新しいAPIの場合、これはうまく動作しません。ここではすべての行がキーとして取得されます –

+0

@SreeVeniそれは私のために正常に動作します。 –

+0

@ chiastic-security:それは私のために働いていませんでしたが、これはconf.set( "key.value.separator.in.input.line"、 "、"); –

5

ドライバコードで次の項目を設定してください。

conf.set("key.value.separator.in.input.line", ","); 
+0

D応答のためのThanx .. しかし、実際に私は新しいAPI(JobConfオブジェクトの代わりにJobオブジェクト)を使用しています。 – pradeep

+0

私は自分のソリューションを更新しました。 –

0

まず、新しいAPIは0.20で終了しませんでした。*あなたが0.20に新しいAPIを使用したいので、もし。*、あなたが達成するためにFileInputFormatを使用することができますyourself.For例で機能を実装する必要があります。 LongWritableキーを無視し、テキスト値をコンマで分割します。

0

KeyValueTextInputFormatクラスは、入力テキストファイルからキーと値のセパレータとしてタブを使用しています。

カスタムセパレータから入力を読み取る場合は、使用している属性で設定を設定する必要があります。新しいHadoopのAPIの

、それは別です:KeyValueTextInputFormatについては

conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ";"); 
1

入力行が"\ tの" によって

Key1  Value1,Value2 

で区切られたキーと値のペアでなければなりませんデフォルトのセパレーターを変更することで、希望どおりに読むことができます。新しいAPI

Here is the solution

//New API 
Configuration conf = new Configuration(); 
conf.set("key.value.separator.in.input.line", ","); 
Job job = new Job(conf); 
job.setInputFormatClass(KeyValueTextInputFormat.class); 

地図

public class Map extends Mapper<Text, Text, Text, IntWritable> { 
private final static IntWritable one = new IntWritable(1); 
private Text word = new Text(); 

public void map(Text key, Text value, Context context) 
     throws IOException, InterruptedException { 
    String line = value.toString(); 
    System.out.println("key---> "+key); 
    System.out.println("value---> "+value.toString()); 
    . 
    . 

出力

key---> one 
value---> first line 
key---> two 
value---> second line 
1

は、それが配列の問題ですについては

最初の行conf.set("key.value.separator.in.input.line", ",")は、Jobクラスのインスタンスを作成する前に指定する必要があります。だから、:

conf.set("key.value.separator.in.input.line", ","); 
Job job = new Job(conf); 
関連する問題