Как денормализовать 2 файла CSV с кардинальностью 0,1 и в основном 1,n с помощью Pig?
Мне нужна помощь для моего сценария свиньи. У меня есть 2 CSV-файла, и я хочу сделать соединение между ними с общим идентификатором.
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" ... но последствия были в том, чтобы иметь ребенка на ребенка... У меня есть некоторые трудности, чтобы играть с кортежем и сумками, вы можете мне помочь?
Заранее спасибо,
Изменить: я нашел решение своей проблемы и больше ^^ см. Ниже
Angelik
1 ответ
Наконец, я нашел решение, и оно работает с несколькими полями для ребенка: (идентификатор, имя, возраст).
- 1. Загрузите два файла
donnees_Enfants = LOAD '/user/cloudera/JeuxDenormalisation/Jeux/mini_jeu2.csv' USING PigStorage (';') AS (id: int, nom_enfant: chararray);
donnees_Parents = LOAD '/user/cloudera/JeuxDenormalisation/Jeux/mini_jeu1.csv' USING PigStorage (';') AS (id_parent: int, nom_parent: chararray, prenom_parent: chararray);
- 2. Объедините файлы с LEFT OUTER, чтобы сохранить клиентов, у которых нет детей.
денормализация = ПРИСОЕДИНЕНИЕ donnees_Parents BY id_parent ВЛЕВО НАРУЖНО, 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. Группировать по клиенту, чтобы клиент имел только одну строку
unParent_parLigne = Денормализация GROUP с помощью (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. ПЛОЩАДЬ по рядам:
ligne_finale = foreach unParent_parLigne генерирует FLATTEN (группу), FLATTEN(BagToTuple(денормализация.(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(";");