gpt4 book ai didi

join - 如何使用 Pig 对基数为 0,1 且主要为 1,n 的 2 个 csv 文件进行非规范化?

转载 作者:行者123 更新时间:2023-12-02 20:06:25 24 4
gpt4 key购买 nike

我的 pig 脚本需要一些帮助。
我有 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

因此,一个客户可以有多个 child ,但一个 child 只能有一个“客户”。

我想创建这个文件:
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”......但结果是每个 child 都有一个lign......
我在玩元组和袋子时遇到了一些困难,你能帮帮我吗?

提前致谢,

编辑:我找到了解决我的问题的方法,更多^^见下文

安吉利克

最佳答案

最后,我找到了解决方案,它适用于 child 的更多字段:(id,name,age)。

-- 1.加载两个文件

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

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

-- 2. 将文件与 LEFT OUTER 连接起来,以保留没有 child 的客户。

非规范化 = 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 on the customer 只有一行 by customer

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. 在行上展平:

ligne_finale = foreach unParent_parLigne generate FLATTEN (group), 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(";");

关于join - 如何使用 Pig 对基数为 0,1 且主要为 1,n 的 2 个 csv 文件进行非规范化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22612706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com