Unm*_*eni 9 java hadoop join apache-pig
让我说JOIN两个关系如下:
-- part looks like:
-- 1,5.3
-- 2,4.9
-- 3,4.9
-- original looks like:
-- 1,Anju,3.6,IT,A,1.6,0.3
-- 2,Remya,3.3,EEE,B,1.6,0.3
-- 3,akhila,3.3,IT,C,1.3,0.3
jnd = JOIN part BY $0, original BY $0;
Run Code Online (Sandbox Code Playgroud)
输出将是:
1,5.3,1,Anju,3.6,IT,A,1.6,0.3
2,4.9,2,Remya,3.3,EEE,B,1.6,0.3
3,4.9,3,akhila,3.3,IT,C,1.3,0.3
Run Code Online (Sandbox Code Playgroud)
请注意,$0每个元组中显示两次.例如:
1,5.3,1,Anju,3.6,IT,A,1.6,0.3
^ ^
|-----|
Run Code Online (Sandbox Code Playgroud)
我可以通过执行以下操作手动删除重复键:
jnd = foreach jnd generate $0,$1,$3,$4 ..;
Run Code Online (Sandbox Code Playgroud)
有没有办法动态删除它?喜欢remove(the duplicate key joiner).
在处理数据集连接和其他数据处理技术时遇到了同样的问题,其中输出中的列名称会重复。
因此,正在研究 UDF,它将通过使用该字段的架构名称并保留第一个唯一列出现数据来删除重复列。
先决条件:
所有字段的名称都应存在
您需要下载此UDF文件并将其打成jar才能使用。
GitHub 中的 UDF 文件位置: GitHub UDF Java 文件位置
我们就以上面的问题为例。
--Data Set A contains this data
-- 1,5.3
-- 2,4.9
-- 3,4.9
--Data Set B contains this data
-- 1,Anju,3.6,IT,A,1.6,0.3
-- 2,Remya,3.3,EEE,B,1.6,0.3
-- 3,Akhila,3.3,IT,C,1.3,0.3
Run Code Online (Sandbox Code Playgroud)
猪脚本:
REGISTER /home/user/
DSA = LOAD '/home/user/DSALOC' AS (ROLLNO:int,CGPA:float);
DSB = LOAD '/home/user/DSBLOC' AS (ROLLNO:int,NAME:chararray,SUB1:float,BRANCH:chararray,GRADE:chararray,SUB2:float);
JOINOP = JOIN DSA BY ROLLNO,DSB BY ROLLNO;
Run Code Online (Sandbox Code Playgroud)
加入后我们将得到列名称 DSA::ROLLNO:int,DSA::CGPA:float,DSB::ROLLNO:int,DSB::NAME:chararray,DSB::SUB1:float,DSB::BRANCH:chararray, DSB::GRADE:chararray,DSB::SUB2:float
用于使其成为 DSA::ROLLNO:int、DSA::CGPA:float、DSB::NAME:chararray、DSB::SUB1:float、DSB::BRANCH:chararray、DSB::GRADE:chararray、DSB::SUB2 :漂浮
DSB::ROLLNO:int 已删除。
我们需要将 UDF 用作
JOINOP_NODUPLICATES = FOREACH JOINOP GENERATE FLATTEN(org.imagine.REMOVEDUPLICATECOLUMNS(*));
Run Code Online (Sandbox Code Playgroud)
其中 org.imagine.REMOVEDUPLICATECOLUMNS 是 UDF。
此 UDF 通过使用架构中的名称删除重复列。因此 DSA::ROLLNO:int 被保留,而 DSB::ROLLNO:int 被从数据集中删除。
| 归档时间: |
|
| 查看次数: |
4561 次 |
| 最近记录: |