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

Posted

技术标签:

【中文标题】如何向从 Pig (Hadoop) 创建的文件添加标题行?【英文标题】:How can I add a header row to files created from Pig (Hadoop)? 【发布时间】:2013-01-07 21:24:58 【问题描述】:

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

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)

有什么想法吗?

【问题讨论】:

【参考方案1】:

你可以使用CSVExcelStorage作为存储功能,让你做你想做的事:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

您通过解释为什么开发人员没有添加它来证明缺少功能是正当的。如果最终消费者真的想要它,你会反对为什么它没有意义吗? 可以使用不同的存储功能。请参阅我的答案以获取链接:***.com/questions/14204275/…【参考方案3】:

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

正如@Winni 所建议的那样,保留一个架构文件是有一些变通方法的,但这是很多黑客行为。

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

我希望这个解决方案显然作用于从 HDFS 输出的部分*文件的串联,而不是存储在 HDFS 中的文件。正如之前的海报所指出的,使用 HDFS 的一些输出来做你想做的事情更有意义。

以上是关于如何向从 Pig (Hadoop) 创建的文件添加标题行?的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop Pig 自定义键名

Pig 0.7.0 错误 2118:无法在 Hadoop 1.2.1 上创建输入拆分

如何在 Hadoop 中的机器之间传输文件并使用 Pig 搜索字符串

Pig 无法处理大文件

Hadoop相关项目Hive-Pig-Spark-Storm-HBase-Sqoop

Pig和Hive的对比