我需要对我的一部分数据进行反规范化。我有一些数据donnees\u porteur(在json中),我想集成donnees\u 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)}}
--我在门卫和孩子之间做连接(基数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)};
--我把一个搬运工的所有孩子都挤在一排
test2 = GROUP test BY ID;
--我得到一个袋子,里面装着不同的一对婴儿。所以我需要重建线路。我尝试:
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为包状的孩子
3条答案
按热度按时间bwntbbo31#
test3=foreach test2生成$0,$1.0;
测试3将有组,只有儿童部分
ioekq8ef2#
试试这个
vdzxcuhz3#
最后,我被困在我的方法,因为袋segm。
实际上,在我的pig版本中,还不支持按包分组。
所以我改变了方式:
谢谢你的提示!