7

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

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

4 回答 4

15

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

STORE output INTO '/outputfolder/' USING org.apache.pig.piggybank.storage.CSVExcelStorage('\t', 'NO_MULTILINE', 'UNIX', 'WRITE_OUTPUT_HEADER');

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

于 2015-07-01T07:55:40.233 回答
11

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

您要求的是一种在 Pig 完成工作后保留模式的方法,这样您就不必记住它是什么或在某个地方查找它。从 Pig 0.10 开始,这可以PigStorage通过将关系的模式存储为 JSON 文件 .pig_schema 与输出在同一目录中来实现。有关它是什么以及如何使用它的更多详细信息,请参阅此页面。

于 2013-01-07T22:56:36.073 回答
1

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

正如@Winni 所建议的那样,通过保留架构文件可以解决问题,但这是很多黑客行为。

戴上消费者的帽子(我也是开发人员),我不得不说 Pig 缺少这个功能。当 Pig 在 PigStorage 中以 CSV 文件的形式输出内容时,我们不在乎它对猪有多大意义,以提供具有标题行的能力,让那些健忘的小用户理解数据。

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

于 2013-09-21T02:14:46.217 回答
0

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

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

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

于 2013-10-09T18:31:52.197 回答