0

豚のスクリプトの助けが必要です。2 つの csv ファイルがあり、それらを共通の ID で結合したいと考えています。

customer.csv :
1   ; nom1   ; prenom1   
2   ; nom2   ; prenom2   
3   ; nom3   ; prenom3   


child.csv
1  ; enfant_1_1  
2  ; enfant_1_2  
3  ; enfant_1_3  
1  ; enfant_2_1  
1  ; enfant_3_1

したがって、1 人の顧客は多くの子を持つことができますが、子は 1 つの「顧客」しか持つことができません。

このファイルを作成したい:

1   ; nom1   ; prenom1  ; enfant_1_1  ; enfant_2_1  ; enfant_3_1    
2   ; nom2   ; prenom2  ; enfant_1_2   
3   ; nom3   ; prenom3  ; enfant_1_3   

これは私の方法です:

最初に私は持っていることを試みます:

1  ; enfant_1_1  ; enfant_2_1  ; enfant_3_1
2  ; enfant_1_2
3  ; enfant_1_3

そして、custome.csv との結合を行った後

最も簡単な方法があると思うことを教えてください:)

これは私のスクリプトです:

donnees_Enfants = LOAD '/user/cloudera/Jeux/mini_jeu2.csv' USING PigStorage(';')
AS (id_parent:int,nom_enfant:chararray);

group_enfants = GROUP donnees_Enfants BY id_parent;

enfant_uneLigne = foreach group_enfants generate group, donnees_Enfants.nom_enfant;

grunt> echantillon = LIMIT enfant_uneLigne 50;
grunt> DUMP echantillon;

DESCRIBE の場合: group_enfants: {group: int,donnees_Enfants: {(id_parent: int,nom_enfant: chararray)}} enfant_uneLigne: {group: int,{(nom_enfant: chararray)}}

結果 :

(1,{( enfant_2_1  ),( enfant_1_1  ),( enfant_3_1  )})
(2,{( enfant_2_2  )})
(3,{( enfant_2_3  )})

「enfant_1_2」を平坦化しようとしました...しかし、その結果、子ごとに1つのリグが発生しました...タプルとバッグをいじるのが難しいのですが、助けてもらえますか?

前もって感謝します、

編集:私は私の問題などの解決策を見つけました^^以下を参照してください

アンゲリック

4

1 に答える 1

1

最後に、解決策を見つけました。それは、子のより多くのフィールドで機能します:(id、name、age)。

-- 1. 2 つのファイルをロードする

donnees_Enfants = LOAD '/user/cloudera/JeuxDenormalisation/Jeux/mini_jeu2.csv' USING PigStorage(';') AS (i​​d:int,nom_enfant:chararray);

donnees_Parents = LOAD '/user/cloudera/JeuxDenormalisation/Jeux/mini_jeu1.csv' USING PigStorage(';') AS (i​​d_parent:int,nom_parent:chararray,prenom_parent:chararray);

-- 2. ファイルを LEFT OUTER と結合して、子供がいない顧客を保持します。

denormalisation = JOIN donnees_Parents BY id_parent LEFT OUTER, donnees_Enfants BY id ;

(9, nom9   , prenom9   ,9, enfant_2_9  )
(9, nom9   , prenom9   ,9, enfant_3_9  )
(9, nom9   , prenom9   ,9, enfant_1_9  )
(10, nom10  , prenom10  ,10, enfant_3_10)
(10, nom10  , prenom10  ,10, enfant_1_10 )
(10, nom10  , prenom10  ,10, enfant_2_10 )

-- 3. 顧客の GroupBy で、顧客ごとに 1 つの行のみを持つようにします。

unParent_parLigne = (id_parent, nom_parent, prenom_parent) による GROUP 非正規化;

((48, nom48  , prenom48  ),{(48, nom48  , prenom48  ,48, enfant_2_48 ),(48, nom48  , prenom48  ,48, enfant_1_48 )})
((49, nom49  , prenom49  ),{(49, nom49  , prenom49  ,49, enfant_2_49 ),(49, nom49  , prenom49  ,49, enfant_1_49 )})
((50, nom50  , prenom50  ),{(50, nom50  , prenom50  ,50, enfant_2_50 ),(50, nom50  , prenom50  ,50, enfant_1_50 )})
((51, nom51  , prenom51  ),{(51, nom51  , prenom51  ,51, enfant_1_51 )})

-- 4. 行の FLATTEN :

ligne_finale = foreach unParent_parLigne generate FLATTEN (グループ), FLATTEN(BagToTuple(denormalisation.(donnees_Enfants::nom_enfant,donnees_Enfants::age)));

(9, nom9   , prenom9   , enfant_2_9  , enfant_3_9  , enfant_1_9  )
(10, nom10  , prenom10  , enfant_3_10, enfant_1_10 , enfant_2_10 )
(11, nom11  , prenom11  , enfant_1_11 , enfant_2_11 )

または、さらにフィールドがある場合 (「donnees_Enfants::age」を使用):

(8, nom8   , prenom8   , enfant_3_8  , age_3_8 , enfant_2_8  , age_2_8 , enfant_1_8  , age_1_8 )
(9, nom9   , prenom9   , enfant_2_9  , age_2_9 , enfant_3_9  , age_3_9 , enfant_1_9  , age_1_9 )
(10, nom10  , prenom10  , enfant_3_10 , age_3_10, enfant_1_10 , age_1_10, enfant_2_10 , age_2_10)

-- 5. データを csv ファイルに保存 STORE ligne_finale INTO '/user/cloudera/JeuxDenormalisation/Resultats/test4' USING org.apache.pig.piggybank.storage.PigStorageSchema(";");

于 2014-03-25T14:33:05.377 に答える