web-dev-qa-db-ja.com

Piglatinを使用してテキストファイルをロードしているときにヘッダーをスキップする

テキストファイルがあり、最初の行にはヘッダーが含まれています。ここで、データに対していくつかの操作を実行したいのですが、PigStorageを使用してファイルをロードするときに、ヘッダーも必要になります。ヘッダーをスキップしたいだけです。そうすることは可能ですか(直接またはUDFを介して)?

これは、データをロードするために使用しているコマンドです。

input_file = load '/home/hadoop/smdb_tracedata.csv'
USING PigStorage(',')
as (trans:chararray, carrier:chararray,aainday:chararray);
16
Pawan Kumar

豚バージョン0.11をお持ちの場合は、これを試すことができます。

input_file = load '/home/hadoop/smdb_tracedata.csv' USING PigStorage(',') as (trans:chararray, carrier :chararray,aainday:chararray);

ranked = rank input_file;

NoHeader = Filter ranked by (rank_input_file > 1);

Ordered = Order NoHeader by rank_input_file

New_input_file = foreach Ordered Generate trans, carrier, aainday;

これにより、最初の行が削除され、New_input_fileは元の行とまったく同じになりますが、ヘッダー行はありません(ヘッダー行がファイルの最初の行であると想定)。ランク演算子はpig0.11でのみ使用できるため、以前のバージョンを使用している場合は、別の方法を見つける必要があることに注意してください。

編集:New_input_fileが元の入力ファイルと同じ順序を維持するように、順序付けられた行を追加しました

9
Davis Broda

通常、この問題を解決する方法は、ヘッダーにあることがわかっているものにFILTERを使用することです。たとえば、次のデータ例を考えてみます。

STATE,NAME
MD,Bob
VA,Larry

やります:

B = FILTER A BY state != 'STATE';
9
Donald Miner

これを行う別の方法は次のとおりです。

  • リレーションのヘッダーレコードを含む完全なファイルをロードします

    fileAllRecords = LOAD 'csvfilename' using PigStorage(',');
    
  • Linuxのtailコマンドを使用して、データレコードのみをストリーミングします

    fileDataRecords = STREAM fileAllRecords THROUGH `tail -n +2` AS (chararray:f1 ..)
    
  • ヘッダーレコードが削除されたことを確認するには、次のコマンドを使用します-

    firstFewRecords = STREAM fileDataRecords THROUGH `head -20`;
    DUMP firstFewRecords;
    
7
user3397123

使用したい CSVExcelStorage 貯金箱にあります。ヘッダー、行末、引用符で囲まれたフィールド、その他のCSVオプションの処理方法に関するパラメーターを設定できます。必要なコンストラクターは、少なくとも0.12のPIGバージョンでのみ使用可能であり、次の署名があります。

CSVExcelStorage(String delimiter, String multilineTreatmentStr, String eolTreatmentStr, String headerTreatmentStr) 

以下の豚のコード:

REGISTER /usr/lib/pig/piggybank.jar;

input_file = load '/home/hadoop/smdb_tracedata.csv'
USING CSVExcelStorage(',', 'default', 'NOCHANGE', 'SKIP_INPUT_HEADER')
as (trans:chararray, carrier:chararray,aainday:chararray);
6
Mike Pone