如何将hadoop中的两个或多个部分文件合并到单个文件中,使合并输出具有整个数据,但只有一个标头位于第一行合并输出中。
文件1
column1|column2|column3 20000|newyork|john 30000|sydney|joseph
文件n
column1|column2|column3 60000|delhi|mike 30000|sydney|joseph
合并后的输出应为
column1|column2|column3 20000|newyork|john 30000|sydney|joseph 60000|delhi|mike 30000|sydney|joseph
有没有使用hadoop fs -cat命令的简单方法..?
或通过任何其他方法..
答案 0 :(得分:1)
在不创建索引或排名的情况下保留标题是相当复杂的,因为在Pig中,元组的集合是未排序的。这是Pig工作的样子,使用排序和顺序将标题置于顶部。
<强> header_ranked.pig 强>
HEADER = LOAD 'header.txt' USING PigStorage('|') AS (b0:int,b1:chararray,b2:chararray,b3:chararray);
H1 = LOAD 'header_test' USING PigStorage('|') AS (c1:chararray,c2:chararray,c3:chararray);
F_H1 = FILTER H1 BY NOT (c1 MATCHES 'column1' AND c2 MATCHES 'column2' AND c3 MATCHES 'column3');
R_H1 = RANK F_H1 by c1 DESC DENSE;
U = UNION R_H1, HEADER;
O = ORDER U by rank_F_H1;
F = FOREACH O GENERATE c1,c2,c3;
dump F;
两个示例文件(每个文件包含2条记录和一个标题行)放在名为header_test
的目录中。此外,为了使该程序正常工作,我必须使用以下格式创建头文件:
<强> header.txt 强>
0|column1|column2|column3
遍历代码,包含标题的文件(稍微修改为包含附加列,即等级值为0)将加载到HEADER
别名中。
接下来,实际数据会加载到H1
别名中,因为它会抓取header_test
目录下的所有文件。
F_H1
过滤掉数据中的所有标头。如果您有{20}个文件从H1
目录加载到header_test
,那么这20个标题现在将从数据中过滤掉。
R_H1
按过滤顺序在过滤后的数据上创建排名,不会跳过任何数字。
U
有效地将排名过滤的数据与0|column1|column2|column3
标题行连接。
O
按排名对数据进行排序,以便标题(排名为0)显示在顶部。
最后,F
摆脱了排名,留下了干净的元组。
<强>结果
(column1,column2,column3)
(60000,delhi,mike)
(30000,sydney,joseph)
(30000,sydney,joseph)
(20000,newyork,john)
基本上,将标题保留在一个文件中,将其从其余文件中剥离,然后将它们混合在一起。但不确定它是否会保持分类,但尚未对其进行彻底测试。
H1 = LOAD 'header_test/header1.txt' USING PigStorage('|') AS (c1:chararray,c2:chararray,c3:chararray);
H2 = LOAD 'header_test/header2.txt' USING PigStorage('|') AS (d1:chararray,d2:chararray,d3:chararray);
F_H2 = FILTER H2 BY NOT (d1 MATCHES 'column1' AND d2 MATCHES 'column2' AND d3 MATCHES 'column3');
U = UNION H1, F_H2;
dump U;
<强>结果
(column1,column2,column3)
(20000,newyork,john)
(30000,sydney,joseph)
(60000,delhi,mike)
(30000,sydney,joseph)