2

次の形式のデータがあります。

37101000ssd48800^A1420asd938987^A2011-09-10^A18:47:50.000^A99.00^A1^A0^A
37101000sd48801^A44557asd03082^A2011-09-06^A13:24:58.000^A42.01^A1^A0^A

だから最初に文字通りそれを取り、試しました:

line = line.split("^A")

そしてまた

line = line.split("\\u001")

したがって、問題は次のとおりです。

これを行うと、最初のアプローチはローカルマシンで機能します。

cat input.txt | python mapper.py 

ローカルでは正常に実行されますが (input.txt は上記のデータです)、Hadoop ストリーミング クラスターでは失敗します。

"\\u001"区切り文字として使用する必要があると誰かに言われましたが、これもローカル マシンでもクラスターでも機能しません。

Hadoop 関係者向け:

次を使用してローカルでデバッグする場合:

cat input.txt | python mapper.py | sort | python reducer.py

これは"^A"、ローカルで区切り記号として使用すると問題なく実行されますが、クラスターで実行するとエラーが発生し、エラーコードもあまり役に立ちません...

これをデバッグするにはどうすればよいですか?
ありがとう

4

1 に答える 1

5

元のデータが区切り文字として control-A を^A使用し、データをリストするために使用しているものと同じように印刷されている場合、2 つの選択肢があります。

  1. 使用するリストのデータを、使用する Python スクリプトにパイプしますsplit('^A')

  2. split('\u001')実際のコントロール A 値を分割するために使用します。

後者は、ほとんどの場合、あなたが本当に望むものになるでしょう. これが機能しなかった理由はsplit('\\u001')、バックスラッシュをエスケープして を書いたため\u001、control-A ではなくリテラル文字列で分割しているためです。

元のデータに区切り文字として実際に^A(キャレットの後に が続く) がある場合は、単に を使用します。Asplit('^A')

于 2012-11-19T21:12:12.200 に答える