1

サーバーログの大規模なログ分析にPIGを活用することを目指しています。ファイルから PIG マップ データ型をロードする必要があります。

以下のデータでサンプルの PIG スクリプトを実行してみました。

「test」という名前の CSV ファイルの行 (PIG によって処理される) は、次のようになります。

151364,[ref#R813,highway#secondary]

私のPIGスクリプト

a = LOAD 'test' using PigStorage(',') AS  (id:INT, m:MAP[]);
DUMP a;

アイデアは、int と 2 番目の要素をハッシュマップとしてロードすることです。ただし、ダンプすると、int フィールドは正しく解析されますが (ダンプに出力されます)、map フィールドは解析されず、解析エラーが発生します。

何かが足りない場合、誰かが説明してもらえますか?

4

2 に答える 2

1

最後に、私は問題を理解しました。区切り文字を「,」から別の文字、たとえばパイプに変更するだけです。フィールド区切り文字は、マップに使用される区切り文字「、」と混同されていました:)

The string 151364,[ref#R813,highway#secondary] was getting parsed into,
field1: 151364  field2: [ref#R813  field3: highway#secondary]
Since '[ref#$813' is not a valid map field, there is a parse error.

PigStorage 関数のソース コードも調べて、解析ロジックを確認しました -ソース コード

@Override
public Tuple getNext() throws IOException {
        for (int i = 0; i < len; i++) {
            //skipping some stuff
            if (buf[i] == fieldDel) { // if we find delim
                readField(buf, start, i); //extract field from prev delim to current
                start = i + 1;
                fieldID++;
            }
        }
 }

したがって、PIG はデリミタによってフィールドを分割するため、フィールドの解析がマップに使用されるセパレータと混同される原因となります。

于 2012-08-31T06:15:51.493 に答える
1

区切り文字に関連する問題があると思います (フィールド区切り文字が何らかの形でマップ フィールドの解析に影響を与えている、またはマップ区切り文字と混同されているなど)。

この入力データが使用される場合 (フィールド区切り文字としてセミコロンを使用したことに注意してください):

151364;[ref#R813,highway#secondary]

以下は私のうなり声シェルからの出力です:

grunt> a = LOAD '/tmp/temp2.txt' using PigStorage(';') AS (id:int, m:[]);
grunt> dump a;
...
(151364,[highway#secondary,ref#R813])

grunt> b = foreach a generate m#'ref'; 
grunt> dump b;
(R813)
于 2012-08-31T05:21:13.823 に答える