我正在编写类似于以下内容的猪拉丁文字:
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)
有什么想法吗?
答案 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,可以直接输出到新文件。)