0

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

isotimestamp source service info serviceid msg hostname requsetid

2013-08-22T13:23:18.226220+01:00  indiana  service2q  info  255  " processing  
request "  host1   e2cerd22  

UDF で ISO タイムスタンプを日時に変換できました。メッセージはスペースで区切られ、メッセージの長さは一定ではありません。pig-storage('')(メッセージ ビットがスペースで区切られているため)データをロードしようとすると、メッセージの次のビットが他の列データとして取得されます。

上記の例で、ホスト名を生成すると、メッセージのリクエスト ビットが表示されます。Pig で MAP などのデータを処理する特定の方法はありますか? 使用しようとしましTO-MAPたが、必要なマップ変換を達成できませんでした。

tomapdata = FOREACH data GENERATE  myudf.test(dt)as date, 
            TOMAP(source,service,info,serviceid,msg,hostname,requestid)as m;

getdata = FOREACH tomapdata GENERATE dt, m#hostname, m#serviceid;

chararrayデータの残りの部分を地図としてロードすることはできますか?

load 'data.log' as (dt:chararray , m:MAP[chararray] ); 
Foreach data generate m#source ; 

質問:

pig で MAP としてデータをロードする際に私を案内してくれる人はいますか?
Pig で MAP としてデータをロード/処理することについて、だれかが提案できますか?

**必要な地図:

source#indiana 

service#service2q

msg#"processing  request" 

hostname#host1

requestid#ec2cerd22**
4

3 に答える 3

0

私が知る限り、あなたの問題はマップの作成ではなく、Pig が"データ内のマークを尊重し、それらの間のスペースで分割しないことを望んでいるという事実です。msgそのような引用符を持つ唯一のフィールドであることがわかっている場合は、次のハックがあります。

predata = LOAD 'input' USING PigStorage('"') AS (initial:chararray, msg:chararray, final:chararray);
data =
    FOREACH predata
    GENERATE
        FLATTEN(STRSPLIT(initial, ' ', 5) AS (
            isotimestamp:chararray,
            source:chararray,
            service:chararray,
            info:chararray,
            serviceid:chararray),
        msg,
        FLATTEN(STRSPLIT(final, ' ', 2) AS (
            hostname:chararray,
            requestid:chararray);

そして、あなたは去ります。地図は必要ありません。

于 2013-09-27T15:46:39.543 に答える
0

私の知る限りでは、マップの開始とマップの終了を示すファイルに [ ] がないため、組み込み関数を使用してそのデータをマップとしてロードすることはできません。

そうは言っても、TOMAPが失敗する理由はわかったと思います。マップはキーと値のペアで構成されているため、TOMAP の入力は偶数でなければなりません。これは、最初のすべての列をキーとして、すべての 2 番目の列を値として取るためです。TOMAP にはちょうど 7 つの引数があり、最後の value 引数が欠落しています。すべてのデータを 1 つのキーに関連付けるには、次のようにします。

(たとえば、ソースがキーであると想定されています)

tomapdata = FOREACH data GENERATE myudf.test(dt) as date, TOMAP(source,TOTUPLE(service,info,serviceid,msg,hostname,requestid))as m;

これには、キーのソースと、その他すべてのタプルが値として含まれます。

列を追加するのを単に忘れた場合は、TOMAP の最後に列を追加するだけで機能するはずです。

代わりに、単にすべてをセットとして取得しようとしていて、それをキーと値のペアにすることが重要でない場合は、TOTUPLE または TOBAG を使用できる可能性があります。

于 2013-09-27T13:01:36.810 に答える
0

私はこれに対するDavis Brodaの答えが好きでしたが、悲しいことに次のようなことを試しました:

----sample_data.txt
open,apache,another,pig
open,apache,apache,pig
apache,hadoop

----my.pig
A = LOAD '$input' AS chararray;
B = FOREACH A GENERATE
    STRSPLIT($0,',').$0 AS myvals:chararray
    , TOMAP(STRSPLIT($0,',').$0,STRSPLIT($0,',').$1) AS mymap:map [(i:chararray)];
-- this fails   , TOMAP(STRSPLIT($0,',')) AS mymap:map [(i:chararray)];
C = FOREACH B GENERATE $1#'open';
DUMP C;
DESCRIBE C;

$>pig -x local -param input=sample_data.txt my.pig
(apache)
(apache)
()
C: {(i: chararray)}

残念ながら、STRSPLIT の出力はタプルですが、空のマップ オブジェクトと値が出力されません。Pig 0.11 では、動的マップの作成が許可されていないようです。

于 2013-12-12T19:53:29.120 に答える