我的猪脚本需要一些帮助。 我有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 ; 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”......但后果是每个孩子都有一个l .. 我和元组和包包有些困难,你能帮助我吗?
提前致谢,
编辑:我找到了解决问题的方法,更多^^见下文
Angelik
答案 0 :(得分:1)
最后,我找到了解决方案,它适用于儿童的更多字段:(id,name,age)。
- 1.加载两个文件
donnees_Enfants = LOAD'/user/cloudera/JeuxDenormalisation/Jeux/mini_jeu2.csv'使用PigStorage(';') AS(id:int,nom_enfant:chararray);
使用PigStorage(';') AS(id_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客户只有一行客户
unParent_parLigne = GROUP denormalisation by(id_parent,nom_parent,prenom_parent);
((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生成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' 使用org.apache.pig.piggybank.storage.PigStorageSchema(“;”);