Как денормализовать 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(";");

Другие вопросы по тегам