apache pig -我如何添加一个头行,从pig (Hadoop)创建的文件



我正在写一个类似于下面的猪拉丁脚本:

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)

任何想法?

您可以使用CSVExcelStorage作为存储函数,它允许您精确地执行您想要的操作:

将输出存储到'/outputfolder/'org.apache.pig.piggybank.storage。CSVExcelStorage('t', 'NO_MULTILINE', 'UNIX', 'WRITE_OUTPUT_HEADER');

使用"WRITE_OUTPUT_HEADER"选项将把头文件写入满足你用例的每个文件。

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

你所要求的是在Pig完成它的工作后保持模式的一种方法,这样你就不需要记住它是什么或者在某处查找它。从Pig 0.10开始,通过将关系的模式存储为JSON文件.pig_schema,在与输出相同的目录中,PigStorage已经实现了这一点。关于这是什么以及如何使用它的详细信息,请参阅本页

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

正如@Winni所建议的那样,有一些变通的办法是保留一个模式文件,但这需要大量的修改。

作为一名消费者(我也是一名开发人员),我不得不说Pig缺乏这个功能。当pig在PigStorage中以CSV文件的形式输出某些内容时,我们不关心它对pig有多大意义,为那些健忘的用户提供也有标题行的能力来理解数据。

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

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

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

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

最新更新