我正在写一个类似于下面的猪拉丁脚本:
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,则可能直接输出到新文件)