0

私を助けてください..それは本当に緊急です..締め切りが近づいています.2週間から立ち往生しています..私の頭を壊しますが、結果はありません. 私はピグラタンの初心者です。csv ファイルからデータをフィルター処理する必要があるシナリオがあります。csv は hdfs にあり、2 つの列があります。

grunt>> fl = load '/user/hduser/file.csv' USING PigStorage(',') AS (conv:chararray, clnt:chararray);
grunt>> dump f1;
("first~584544fddf~dssfdf","2001")
("first~4332990~fgdfs4s","2001")
("second~232434334~fgvfd4","1000")
("second~786765~dgbhgdf","1000)
("second~345643~gfdgd43","1000")

私がする必要があるのは、最初の '~' 記号の前の最初の単語だけを抽出し、それを csv ファイルの 2 番目の列の値と連結することです。また、返された連結結果をグループ化し、そのような同様の行の数を数え、出力として新しい csv ファイルを作成する必要があります。ここでは、再び 2 列になります。1 列目は連結値、2 列目は行数です。すなわち

("first 2001","2")
("second 1000","3")

等々。

ここにコードを書きましたが、うまくいきません。私はSTRSPLITを使用しました。入力csvファイルの最初の列の値を分割しています。しかし、最初の分割値を抽出する方法がわかりません。コードを以下に示します。

convData = LOAD '/user/hduser/file.csv' USING PigStorage(',') AS (conv:chararray, clnt:chararray);

fil = FILTER convData BY conv != '"-1"'; --im using this to filter out the rows that has 1st column as "-1".

data = FOREACH fil GENERATE STRSPLIT($0, '~');

X = FOREACH data GENERATE CONCAT(data.$0,' ',convData.clnt);

Y = FOREACH X GROUP BY X;

Z = FOREACH Y GENERATE COUNT(Y);

var = FOREACH Z GENERATE CONCAT(Y,',',Z);

STORE var INTO '/user/hduser/output.csv' USING PigStorage(',');
4

1 に答える 1

1

STRSPLIT番号付き構文を使用してアクセスできる個々の要素のタプルを返します。これはあなたが必要とするものです:

data = FOREACH fil GENERATE STRSPLIT($0, '~') AS a, clnt;
X = FOREACH data GENERATE CONCAT(a.$0,' ', clnt);
于 2013-04-04T16:25:00.090 に答える