これはあなたを助けることができるかもしれません。私はこれをapacheから見つけました...org
行をキー/値ペアに分割する方法のカスタマイズ前述のように、Map / Reduceフレームワークは、マッパーのstdoutから行を読み取るときに、行をキー/値ペアに分割します。デフォルトでは、最初のタブ文字までの行のプレフィックスがキーであり、行の残りの部分(タブ文字を除く)が値です。
ただし、このデフォルトはカスタマイズできます。タブ文字(デフォルト)以外のフィールド区切り文字を指定できます。また、キーと値の間の区切り文字として、行の最初の文字(デフォルト)ではなくn番目(n> = 1)の文字を指定できます。例えば:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
-input myInputDirs \
-output myOutputDir \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-D stream.map.output.field.separator=. \
-D stream.num.map.output.key.fields=4
上記の例では、-D stream.map.output.field.separator=.
「。」を指定します。マップ出力のフィールドセパレータとして、および4番目の「。」までのプレフィックスとして。行内がキーになり、行の残りの部分(4番目の「。」を除く)が値になります。行の「。」が4つ未満の場合、行全体がキーになり、値は空のTextオブジェクト(new Text( "")によって作成されたものなど)になります。
同様に、キーと値の間のセパレータとして、reduce出力の行のn番目のフィールドセパレータを使用-D stream.reduce.output.field.separator=SEP
して指定できます。-D stream.num.reduce.output.fields=NUM
同様に、 map/reduce入力の入力セパレーターとしてstream.map.input.field.separator
とを指定できます。stream.reduce.input.field.separator
デフォルトでは、区切り文字はタブ文字です。