如何向从Pig(Hadoop)创建的文件添加标题行?

时间:2013-01-07 21:24:59

标签: hadoop apache-pig

我正在编写类似于以下内容的猪拉丁文字:

A = load 'data' using PigStorage('\t');
store A into my_data using PigStorage();

此输出

(Bob, 10, 4.0)
(Jim, 11, 3.25)
(Paul, 9, 2.75)

我想为存储在HDFS中的每个文件添加第一个标题行

(Name, Age, GPA)
(Bob, 10, 4.0)
(Jim, 11, 3.25)
(Paul, 9, 2.75)

有什么想法吗?

4 个答案:

答案 0 :(得分:11)

这对猪来说真的没有意义。每一行都是一个单独的数据记录,因此,除非确实有一个名为Name的人,年龄为Age,GPA为GPA,否则有这样的行是错误的。此外,Pig不保证输出字段的顺序(除非使用ORDER BY),因此您的标题行可能会出现在任何地方。

你要求的是在Pig完成其工作后保持你的架构的方法,这样你就不必记住它是什么或者在某处查找它。从Pig 0.10开始,通过将关系的模式作为JSON文件.pig_schema存储在与输出相同的目录中,可以使用PigStorage。有关这是什么以及如何使用它的详细信息,请参阅this page

答案 1 :(得分:11)

您可以使用CSVExcelStorage作为存储功能,让您可以精确地执行所需操作:

  

存储输出INTO'/ outputfolder /'使用   org.apache.pig.piggybank.storage.CSVExcelStorage('\ t','NO_MULTILINE','UNIX','WRITE_OUTPUT_HEADER');

使用“WRITE_OUTPUT_HEADER”选项会将标题写入满足您用例的每个文件。

答案 2 :(得分:1)

答案是不,你不能做你真正想做的事。

正如@Winni建议的那样,通过保留一个模式文件可以解决一些问题,但这很糟糕。

戴着消费者帽子(我也是开发人员),我不得不说Pig缺乏此功能。 我们不关心猪在PigStorage中输出的东西本质上是一个CSV文件时有多大意义,以提供能够同时拥有标题行的能力,让那些讨厌的健忘用户理解数据。

当我有一行时,大约有十个不同的日期时间,并且我几乎不可能理解数据,直到我手动添加标题行。

答案 3 :(得分:0)

我认为你最好的选择是在Grunt shell的测试集上描述你要输出的关系,然后复制&将其粘贴到例如bash命令将记录附加到文件的顶部,然后从HDFS中将其记录到平面文件中。如下所示:

sed -i '1s/^/(Name, Age, GPA) /' filename.tsv

(请注意,如果写入这将是就地写入,因此如果您是shell命令n00b,可以直接输出到新文件。)