合并两个部分文件与标题仅作为第一行Hadoop

时间:2014-03-11 06:20:24

标签: hadoop apache-pig cloudera

如何将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命令的简单方法..?

或通过任何其他方法..

1 个答案:

答案 0 :(得分:1)

方法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)



方法2:

基本上,将标题保留在一个文件中,将其从其余文件中剥离,然后将它们混合在一起。但不确定它是否会保持分类,但尚未对其进行彻底测试。

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)