2017-09-07 4 views
0

入力:Pigの値のリストをバッグとして読み取って特定の値と比較するにはどうすればいいですか?

IDS:

1111,2222,3333,4444 

が従業員:

{"name":"abc","id":"1111"} {"name":"xyz","id":"10"} 
{"name":"z","id":"100"} {"name":"m","id":"99"} 
{"name":"pqr","id":"3333"} 

私はそのIDが与えられたリストに存在する従業員をフィルタリングします。

予想される出力:

{"name":"xyz","id":"10"} {"name":"z","id":"100"} 
{"name":"m","id":"99"} 

既存のコード:

idList = LOAD 'pathToFile' USING PigStorage(',') AS (id:chararray); 
empl = LOAD 'pathToFile' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (data:map[]); 
output = FILTER empl BY data#'id' in (idList); 
-- not working, states: A column needs to be projected from a relation for it to be used as a scalar 
output = FILTER empl BY data#'id' in (idList#id); 
-- not working, states: mismatched input 'id' expecting set null 

答えて

0

JsonLoad()pig > 0.10でネイティブで、スキーマを指定することができます

empl = LOAD 'pathToFile' USING JsonLoader('name:chararray, id:chararray'); 
DUMP empl; 

(abc,1111) 
(xyz,10) 
(z,100) 
(m,99) 
(pqr,3333) 

idListをタイプchararrayの1つの列テーブルとしてロードしていますが、リストが必要です。 1列の表としてそれをロード

は(あなたがファイルを変更すると、その行ごとに1つだけのレコードがあることを意味する):

idList = LOAD 'pathToFile' USING PigStorage(',') AS (id:chararray); 
DUMP idList; 

(1111) 
(2222) 
(3333) 
(4444) 

または1行のファイルとしては、それはdoesnのように、我々は、セパレータを変更します「Tは、(それ以外の場合は、負荷にのみ、最初の列をリードします)の列に分割:

idList = LOAD 'pathToFile' USING PigStorage(' ') AS (id:chararray); 
idList = FOREACH idList GENERATE FLATTEN(TOKENIZE(id, '[,]')) AS id; 
DUMP idList; 

(1111) 
(2222) 
(3333) 
(4444) 

は、今、私たちはidがものだけを維持するために、その後idListFILTERには存在しないかを確認するためにLEFT JOINを行うことができます。 outputは予約語ですので、使用しないでください:

res = JOIN empl BY id LEFT, idList BY id; 
res = FILTER res BY idList::id IS NULL; 
DUMP res; 

(xyz,10,) 
(m,99,) 
(z,100,) 
関連する問題