テキストファイルがあり、最初の行にはヘッダーが含まれています。ここで、データに対していくつかの操作を実行したいのですが、PigStorageを使用してファイルをロードするときに、ヘッダーも必要になります。ヘッダーをスキップしたいだけです。そうすることは可能ですか(直接またはUDFを介して)?
これは、データをロードするために使用しているコマンドです。
input_file = load '/home/hadoop/smdb_tracedata.csv'
USING PigStorage(',')
as (trans:chararray, carrier:chararray,aainday:chararray);
豚バージョン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が元の入力ファイルと同じ順序を維持するように、順序付けられた行を追加しました
通常、この問題を解決する方法は、ヘッダーにあることがわかっているものにFILTERを使用することです。たとえば、次のデータ例を考えてみます。
STATE,NAME
MD,Bob
VA,Larry
やります:
B = FILTER A BY state != 'STATE';
これを行う別の方法は次のとおりです。
リレーションのヘッダーレコードを含む完全なファイルをロードします
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;
使用したい 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);