【问题标题】:Loading new files using Pig LOAD statement使用 Pig LOAD 语句加载新文件
【发布时间】:2014-05-15 10:48:35
【问题描述】:

我想将数据从 HDFS 加载到 HBSE 表 sing PIG 脚本。

我的hadfs文件夹结构如下:

-rw-r--r--  1 user supergroup   63 2014-05-15 20:28 dataparse/good/goodrec_051520142028
-rw-r--r--  1 user supergroup   72 2014-05-15 20:30 dataparse/good/goodrec_051520142030
-rw-r--r--  1 user supergroup   110 2014-05-15 20:32 dataparse/good/goodrec_051520142032

以上所有文件名都附有时间戳。

下面是我从 HDFS 加载到 HBASE 的 PIG 脚本:

G = LOAD '/user/user/dataparse/good/' USING PigStorage(',') as (c1:chararray, c2:chararray,c3:chararray,c4:chararray,c5:chararray);
STORE G INTO 'hbase://test' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('t1:name t1:state t1:phone_no t1:gender');

脚本运行良好,所有 3 个文件的数据都写入 Hbase“test”表。

假设一段时间后,如果更多文件以相同的结构进入 HDFS,当我运行 pig 脚本时,它将加载“good”目录中的所有文件以及已读取的文件.那么我怎样才能只加载那些是新文件的文件。不应将已加载的文件再次加载到我的 HBASE 表中。

我该怎么做?

谢谢, 萨普塔什里

【问题讨论】:

  • 以上帖子有更新吗?

标签: hadoop apache-pig


【解决方案1】:

我认为您在这里有几个选择。

使用 glob

  • 使用 shell 脚本获取“新”文件,使用 glob 功能 可以将多个文件输入到脚本中。一个相关的用例是 here
  • 如果文件的文件名中有日期和时间戳,那么您可以 直接使用 glob,看here 灵感

使用大枪

  • 如果使用 glob 让您失望,那么您需要拿出大 guns,使用逻辑中的自定义加载函数来识别“新 文件”,你应该很高兴。详细信息here

【讨论】:

  • 嗨,我浏览了你建议的链接,其中解释了 glob 示例。但是使用 glob 我们可以提供模式来读取目录中的特定文件。如果我有新文件进入目录并且每次我都需要更改 glob 模式吗?我想要一种模式,每次添加新文件时,只读取那些新文件而不是旧文件.如何使用 glob 或其他替代方法做到这一点?
  • 您尝试使用基于系统时间等的全局模式。因此,如果您的文件是基于日期和时间戳命名的,并且如果您的 glob 也基于日期和时间戳,那么它应该可以工作
【解决方案2】:

你需要有一些调度机制来让pig作业不时运行。因此,在此过程中,您只能通过不断跟踪时间戳和文件名或任何其他字段来处理之前未处理的文件。

更多信息请看这里Execute Pig from within Java Application

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多