【问题标题】:pig load udf for loading files from several sub directoriespig load udf 用于从多个子目录加载文件
【发布时间】:2012-12-08 17:29:25
【问题描述】:

我想在 pig 中编写一个自定义加载 udf 来从目录结构中加载文件。

目录结构就像一个电子邮件目录。它有一个名为 maildir 的根目录。在这里面我们有各个邮件持有者的子目录。在每个邮件帐户持有者目录中都有几个子目录,如收件箱、已发送、垃圾箱等。

例如:maildir/mailholdername1/inbox/1.txt maildir/mailholdername2/sent/1.txt

我只想读取所有 mailerholdername 子目录中的收件箱文件。

我无法理解:

  1. 应该将什么作为参数传递给加载 udf
  2. 如果只读取相应的收件箱文件,应如何解析整个目录结构。

我想处理一个文件并执行一些数据提取并将其加载为一条记录。因此,如果有 10 个文件,我会得到一个包含 10 条记录的关系 此外,我想对这些收件箱文件进行一些操作并提取一些数据。

【问题讨论】:

  • 你能展示你到目前为止所做的事情吗?
  • 实际上我是通过核心 java 完成的。但是读取和处理 abt 3 gb 的巨大文本文件非常耗时。因此我切换到 pig。但现在我无法做到第一步本身......数据完全是非结构化的。它就像我们编写的普通电子邮件文本文件。因此我们无法直接加载它们,因为没有架构......所以我无法进一步移动......跨度>
  • 嗨,Shrey,你有答案吗?

标签: hadoop user-defined-functions apache-pig


【解决方案1】:

因为你有一个没有可变深度的已定义文件夹结构,我认为它就像传递以下模式作为你的输入路径一样简单:

A = LOAD 'maildir/*/inbox/1.txt' USING PigStorage('\t') AS (f1,f2,f3)

您可能不需要为此创建自己的 UDF,PigLoader 应该能够处理它们,假设它们采用某种分隔格式(上面的示例假设 3 个字段,制表符分隔)。

如果每个收件箱中有多个 txt 文件,请使用 *.txt 而不是 1.txt。最后,如果 maildir 根目录不在您的用户主目录中,您应该使用该文件夹的绝对路径,例如 /data/maildir/*/index/*.txt

【讨论】:

  • 嗨克里斯,谢谢你的回复。但实际上问题是我想一次性处理所有邮件持有人的收件箱文件。假设有200个邮件持有人(根目录下的子目录maildir) ,我不想为单个收件箱子目录编写 LOAD。我希望提及根目录并仅加载所有子目录的收件箱文件。我不知道该怎么做,也不确定 UDF 是否是解决方案以及如何...
  • 你不需要为每个邮箱写一个加载语句,上面的'glob'会保证所有邮箱都会被加载
  • okk...是的,这将加载我需要的所有文件。现在实际的问题是这些文本文件实际上是电子邮件。我需要提取某些属性(及其值),例如来自这些邮件的 TO、FROM、SUBJECT、DATE 等。每个文本文件应生成一条记录。因此,如果所有收件箱中有 100 封邮件,我的关系 A(如在加载语句中)应包含 100 条记录。我该怎么做处理...因为 LOAD 语句处理结构化数据(AS(f1,f2)等),但这里的数据是非结构化的。我必须首先使用一些处理提取我需要的属性。知道怎么做吗?
  • 在处理非结构化文本的情况下,您很可能需要编写一个LoadFunc(除非您可以找到一个已经编写好的),以及一个知道如何处理文件格式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多