与Pig Apache连接后创建包的困难

时间:2014-08-19 09:09:20

标签: hadoop join apache-pig

我需要对我的部分数据进行非规范化。我有一些数据donnees_porteur(在JSON中)我想集成donnees_enfant(用CSV格式)

donnees_enfant = LOAD '/user/cloudera/enfn.csv' USING PigStorage(';') AS (NUM_CART_enf,NUM_ENFN,ANNEES_NAIS);   
donnees_porteur = LOAD '/user/cloudera/part*' USING JsonLoader();

编辑:

    donnees_porteur: {
Id: bytearray,
Infos: (cod_civl: bytearray,lb_civl: bytearray,nom: bytearray,prnm: bytearray,age: bytearray),
Geo: (cod_regn: bytearray,cod_depr: bytearray,cod_comm: bytearray,cp: bytearray,lb_comm: bytearray,cod_npai: bytearray,dt_npai: bytearray,email: bytearray),
Socio: (nb_enf: bytearray,cod_socio: bytearray,lb_socio: bytearray,cod_socio_conj: bytearray,lb_socio_conj: bytearray,cod_sit_faml: bytearray,lb_sit_faml: bytearray),
Segm: {(cod_segm: bytearray,cod_typ_segm: bytearray,dat_deb: bytearray,dat_fin: bytearray)}}

- 我在porteur和enfant(基数1,n)之间进行连接:

test= FOREACH 
    (JOIN donnees_porteur BY Id LEFT, donnees_enfant BY NUM_CART_enf) 
    GENERATE donnees_porteur::Id AS ID, 
    {(donnees_enfant::NUM_CART_enf,donnees_enfant::NUM_ENFN)} AS ENFANT:{(id_enf,numero)};

- 我将“分组”设为只有一行中的所有enfants

test2 = GROUP test BY ID;

- 我获得了一个带有不同的porteur元组的包,每个包含一个enfant。所以我需要重建这条线。我试着用:

test3= FOREACH test2 GENERATE test;

但这并不好。

结果测试2:

(0,{(0,{(0,2)}),(0,{(0,3)}),(0,{(0,1)})})
(1,{(1,{(1,3)}),(1,{(1,1)}),(1,{(1,2)})})
(2,{(2,{(2,1)}),(2,{(2,2)})})

但我想获得:

(0,({(0,2),(0,3),(0,1)}))
(1,({(1,3),(1,1),(1,2)}))
(2,({(2,1),(2,2)}))

你能帮助我吗?


编辑:

我发布了一个“简单”的问题示例。

这是真正的考验:

denorm2 = FOREACH (JOIN donnees_porteur BY Id LEFT, donnees_enfant BY NUM_CART_enf) GENERATE donnees_porteur::Id AS ID, 
    donnees_porteur::Infos AS INFOS, 
    donnees_porteur::Geo AS Geo,
    donnees_porteur::Segm AS Segm,
    {(donnees_enfant::NUM_CART_enf,donnees_enfant::NUM_ENFN)} AS ENFANT:{(id_enf,numero)};

以ID作为字段, INFOS,GEO,作为元组, Segm像ENFANT一样包包

3 个答案:

答案 0 :(得分:1)

test3 = FOREACH test2 GENERATE $ 0,$ 1.ENFANT;

test3将拥有该组,只有ENFANT部分

答案 1 :(得分:1)

试试这个

test= FOREACH 
    (JOIN donnees_porteur BY Id LEFT, donnees_enfant BY NUM_CART_enf) 
    GENERATE 
        donnees_porteur::Id AS ID, 
        donnees_enfant::NUM_CART_enf AS id_enf,
        donnees_enfant::NUM_ENFN AS numero;

test2 = GROUP test BY ID;
test3 = FOREACH test2 
           GENERATE 
               group AS ID, 
               test.(id_enf,numero);

答案 2 :(得分:0)

最后,因为行李袋的缘故,我被我的方法搁浅了。

事实上,在我的猪版本中,尚未支持GROUP BY包。

所以我改变方式:

donnees_porteur = LOAD '/user/cloudera/part*' USING JsonLoader();

donnees_enfant = LOAD '/user/cloudera/enfn.csv' USING PigStorage(';') AS (id_enf,num,annee);

group_enfant_by_id = GROUP donnees_enfant BY id_enf;

test= FOREACH (JOIN donnees_porteur BY Id LEFT, group_enfant_by_id BY group) GENERATE  Id AS Id, 
        Infos as Infos,
        Geo AS Geo,
        Socio AS Socio,
        pdv AS pdv,
        Segm as Segm,
        group_enfant_by_id::donnees_enfant.(num,annee) AS Enfn;

STORE test INTO '' USING JsonStorage();

感谢您的提示!