如何使用 Pig 将数据存储在 HDFS 上的多个分区文件中

Posted

技术标签:

【中文标题】如何使用 Pig 将数据存储在 HDFS 上的多个分区文件中【英文标题】:How do I store data in multiple, partitioned files on HDFS using Pig 【发布时间】:2014-06-27 20:20:28 【问题描述】:

我有一个猪作业,它分析大量日志文件并生成一组属性和一组具有这些属性的 ID 之间的关系。我想将该关系存储在 HDFS 上,但我想以一种对其他 Hive/Pig/MapReduce 作业友好的方式来操作数据或数据子集,而无需摄取完整我的猪工作的输出,因为这是大量的数据。

例如,如果我的关系模式是这样的:

relation: group: (attr1: long,attr2: chararray,attr3: chararray),ids: (id: chararray)

我真的很希望能够对这些数据进行分区,将其存储在如下文件结构中:

/results/attr1/attr2/attr3/file(s)

路径中的 attrX 值是组中的值,并且文件仅包含 id。这将使我能够轻松地对我的数据进行子集化以进行后续分析,而无需复制数据。

即使使用自定义 StoreFunc,也有可能吗?我应该采取不同的方法来实现这个目标吗?

我对 Pig 还很陌生,因此对于我的方法的任何帮助或一般性建议将不胜感激。

提前致谢。

【问题讨论】:

Generate multiple outputs with Hadoop Pig的可能重复 感谢您为我指明这个方向。虽然 PiggyBank 中的默认 MultiStorage 选项并不是我想要的,但我现在看到我想要做的事情应该可以通过自定义 StoreFunc 实现。我会看看源代码,看看我能想出什么。如果我能找到可用的解决方案,我会将其作为答案发布。 【参考方案1】:

Multistore 并不完全适合我尝试做的事情,但它证明了如何编写自定义 StoreFunc 来写入多个分区输出文件的一个很好的例子。我下载了 Pig 源代码并创建了自己的存储函数来解析组元组,使用每个项目来构建 HDFS 路径,然后解析 id 包,将每行一个 ID 写入结果文件。

【讨论】:

以上是关于如何使用 Pig 将数据存储在 HDFS 上的多个分区文件中的主要内容,如果未能解决你的问题,请参考以下文章

从 ES 加载数据并使用 pig 在 HDFS 中存储为 avro

如何使用 PIG 将数据从本地系统加载到 hdfs

Pig UDF 将文件写入 HDFS

如何使用 apache pig 将标题行加入多个文件中的详细行

Pig 读取数据作为 databytearray

如何读取pig运行结果part