2016-07-11 4 views
0

HDFSにcsv形式のファイル(フィールドはカンマ区切りと二重引用符で囲まれています)を受け取り、ヘッダー行を削除して二重引用符を取り除くブタスクリプトを作成しました。 HQLスクリプト。Pig CSVExcelStorage DoubleQuoted Commas

このプロセスは正常に動作しています。しかし、今日私は、テーブルの1つでデータの問題を発見しました。特にこのテーブルのファイルには、ダブルクォート内に複数のカンマを含むことができる文字列フィールドがあります。このため、一部のレコードでHiveの間違った列にデータが正しく読み込まれなくなりました。

ソースでファイルの形式を変更することはできません。

現在、PiggyBank CSVExcelStorageを使用して、次のようにCSVフォーマットを処理しています。これを修正して正しい結果を得ることはできますか?その他の選択肢は何ですか? CSVLoaderもあることに気付きましたが、haventはどのように使用/実装するかを示す例は見つかりませんでした。 Pig CSVLoader

USING org.apache.pig.piggybank.storage.CSVExcelStorage(',','NO_MULTILINE','NOCHANGE','SKIP_INPUT_HEADER') 

編集、追加サンプルデータとテストの結果を追加する:

サンプル入力ファイルのデータ:

の上方に設けられた書式でCSVExcelLoaderを使用して
"P_NAME","P_ID","C_ID","C_NAME","C_TYPE","PROT","I_NAME","I_ID","A_NAME","A_IDS","C_NM","CO"  
"SAMPLEPNAME","123456","789123","SAMPLECNAME","Upload","SAMPLEINAME","This Sample Name of A, B, and C","3234","This Sample Name of A, B, and C","3234","c_name","R" 
"SAMPLEPNAME2","123457","789124","SAMPLECNAME2","Download","SAMPLEINAME2","This Sample Name","3235","This Sample Name","3235","c_name2","Q" 

SAMPLEPNAME,123456,789123,SAMPLECNAME,Upload,SAMPLEINAME,This Sample Name of A, B, and C,3234,This Sample Name of A, B, and C,3234,c_name,R 
SAMPLEPNAME2,123457,789124,SAMPLECNAME2,Download,SAMPLEINAME2,This Sample Name,3235,This Sample Name,3235,c_name2,Q 

Usi CSVLoader()としてNG CSVLoader: お知らせ - パラメータは、コンストラクタに提供するための任意のオプションを見ていない

P_NAME,,,C_NAME,C_TYPE,PROT,I_NAME,,A_NAME,,C_NM,CO 
SAMPLEPNAME,123456,789123,SAMPLECNAME,Upload,SAMPLEINAME,This Sample Name of A, B, and C,3234,This Sample Name of A, B, and C,3234,c_name,R 
SAMPLEPNAME2,123457,789124,SAMPLECNAME2,Download,SAMPLEINAME2,This Sample Name,3235,This Sample Name,3235,c_name2,Q 

私が見る唯一の本当の違いは、私が見たようCSVLoaderは、ヘッダー行を削除されていないということですこのオプションを選択するオプションもなく、ヘッダ名の一部を削除するオプションもありません。

私は間違って何かしていますか?作業上の解決策が評価されます。

+0

ハイブ内のデータがフィールドにそれらのコンマのを持っている必要がない、これを処理する1つの方法は、別の文字のフィールドにカンマを交換することであると言います?「|」 –

+0

@inquisitive_mindはい、私はデータの元の書式を保持する必要があります。 – HendPro12

答えて

2

フィールドでコンマの問題を回避するには、この回避策を試すことができます。

データを1行としてロードします。
"、"を区切り文字として扱い、パイプ文字 '|'で置き換えます。
先頭と末尾の引用符を空の文字列に置き換えます。
行をハイブに「|」でロードします。区切り文字として。

A = LOAD 'test1.csv' AS (lines:chararray); 
ranked = rank A; 
B = FILTER ranked BY (rank_A > 1); 
C = FOREACH B GENERATE REPLACE($1,'","','|'); 
D = FOREACH C GENERATE REPLACE($0,'"',''); 
DUMP D; 

A = LOAD「TEST1。csv 'AS(行:chararray); =ランクAランク付けし

"P_NAME","P_ID","C_ID","C_NAME","C_TYPE","PROT","I_NAME","I_ID","A_NAME","A_IDS","C_NM","CO" 
"SAMPLEPNAME","123456","789123","SAMPLECNAME","Upload","SAMPLEINAME","This Sample Name of A, B, and C","3234","This Sample Name of A, B, and C","3234","c_name","R" 
"SAMPLEPNAME2","123457","789124","SAMPLECNAME2","Download","SAMPLEINAME2","This Sample Name","3235","This Sample Name","3235","c_name2","Q" 

。順

(1,"P_NAME","P_ID","C_ID","C_NAME","C_TYPE","PROT","I_NAME","I_ID","A_NAME","A_IDS","C_NM","CO") 
(2,"SAMPLEPNAME","123456","789123","SAMPLECNAME","Upload","SAMPLEINAME","This Sample Name of A, B, and C","3234","This S 
ample Name of A, B, and C","3234","c_name","R") 
(3,"SAMPLEPNAME2","123457","789124","SAMPLECNAME2","Download","SAMPLEINAME2","This Sample Name","3235","This Sample Name 
","3235","c_name2","Q") 

B = FILTER(rank_A> 1)。

(2,"SAMPLEPNAME","123456","789123","SAMPLECNAME","Upload","SAMPLEINAME","This Sample Name of A, B, and C","3234","This S 
ample Name of A, B, and C","3234","c_name","R") 
(3,"SAMPLEPNAME2","123457","789124","SAMPLECNAME2","Download","SAMPLEINAME2","This Sample Name","3235","This Sample Name 
","3235","c_name2","Q") 

C = FOREACH B REPLACE GENERATE( ' ""'、$ 1 '|');

("SAMPLEPNAME|123456|789123|SAMPLECNAME|Upload|SAMPLEINAME|This Sample Name of A, B, and C|3234|This S 
ample Name of A, B, and C|3234|c_name|R") 
("SAMPLEPNAME2|123457|789124|SAMPLECNAME2|Download|SAMPLEINAME2|This Sample Name|3235|This Sample Name 
|3235|c_name2|Q") 

D = FOREACH C( ' '"'、$ 0')REPLACE GENERATE;

(SAMPLEPNAME|123456|789123|SAMPLECNAME|Upload|SAMPLEINAME|This Sample Name of A, B, and C|3234|This S 
ample Name of A, B, and C|3234|c_name|R) 
(SAMPLEPNAME2|123457|789124|SAMPLECNAME2|Download|SAMPLEINAME2|This Sample Name|3235|This Sample Name 
|3235|c_name2|Q) 

あなたは今でハイブに、このデータをロードすることができます '|' 。区切り文字として

enter image description here