如何使用 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