例: HDFS のタブ区切りテーブルには、Col1、Col2、Col3、Col4 のフィールドがあります。Col1 と Col2 を PIG だけにロードしたい。次の LOAD ステートメントは機能しません。
LOAD '/usr/table1' USING PigStorage ('\t') as (Col1:chararray, Col2:chararray);
例: HDFS のタブ区切りテーブルには、Col1、Col2、Col3、Col4 のフィールドがあります。Col1 と Col2 を PIG だけにロードしたい。次の LOAD ステートメントは機能しません。
LOAD '/usr/table1' USING PigStorage ('\t') as (Col1:chararray, Col2:chararray);
1 つの解決策は、これら 2 つの列のデータを新しいファイルに書き込んで、そのデータを Pig にロードすることです。
ここでは、いくつかの AWK コマンドを使用できます。
Hadoop fs -cat /usr/table1 |awk -f "\t" {print $1,$2} >>newfile.tsv
2番目の解決策は、4列のデータをロードし、2列のデータのみを生成して使用することです。
A = LOAD '/usr/table1' USING PigStorage ('\t') as (Col1:chararray, Col2:chararray,Col3:chararray, Col4:chararray);
B = foreach A generate col1,col2 ;
store b into '/path/to/hdfs';
2 つのフィールドをロードすることはできませんが、すべてのフィールドに名前を付ける必要はありません。
A = LOAD '/usr/table1' USING PigStorage ('\t');
B = FOREACH A GENERATE $0 as col1, $1 as col2;
早い段階で生成を行うと、pig によって生成された map/reduce(s) の以降のステップで、追加の列を移動するコストが発生しません また、ファイルが大きいと仮定すると、提案された cat および awk オプションは使用しません。 pig を使用するほど効率的ではありません (ファイルが map/reduce よりも小さい場合、一般的に非効率的です)
まず、テーブル ファイルをローカル ディレクトリに移動する必要があります。次に、それを pig スクリプトで使用できます。
hdfs dfs -copyToLocal /usr/table1 $HOME/tables/
以下のコードを grunt シェルで実行します
A=LOAD '$HOME/tables/table1' using PigStorage('\t') as (Col1:chararray, Col2:chararray,Col3:chararray, Col4:chararray);
B= foreach A generate $0 as col1,$1 as col2;
Dump B;