使用PigStorage加载数据,缺少最后一个字段

时间:2015-01-21 15:12:31

标签: csv hadoop apache-pig bigdata

我在Hadoop上使用Pig来分析CSV格式的日志。有时,我的数据提供者会在日志中添加新字段,所有新字段都会添加到每行的末尾。

我想知道当globbing模式匹配"旧格式"时,要正确实现这些CSV文件的加载。和"新格式"文件,同时仍然可以访问最新文件的新字段。

让我们举个实例:

2014/12/20/log_2014-12-20.csv:
  f1, f2, f3

2014/12/21/log_2014-12-21.csv:
  f1, f2, f3

2014/12/22/log_2014-12-22.csv:
  f1, f2, f3

2014/12/23/log_2014-12-23.csv:
  f1, f2, f3, f4, f5

2014/12/24/log_2014-12-24.csv:
  f1, f2, f3, f4, f5

请注意2014年12月23日开始出现的新字段:f4和f5。

使用以下Pig语句时,2014-12-23之前的文件数据将不会加载,因此只有Pig别名MYDATA中的2014-12-23开头的数据可用:

MYDATA = LOAD 's3://mybucket/logs/2014/12' using PigStorage(',') as (
  f1: int,
  f2: int,
  f3: int,
  f4: int,
  f5: int
);

如果我想从所有预期的时间范围加载数据,我需要省略新字段:

MYDATA = LOAD 's3://mybucket/logs/2014/12' using PigStorage(',') as (
  f1: int,
  f2: int,
  f3: int
);

但我无法利用最新数据中的新字段。在我的实际用例中,上面的语句存储在Pig宏中,用于从多个脚本中使用日志数据,在宏中添加新字段会破坏我的脚本,这些脚本正在加载不那么新的数据。

您对处理数据方案中的此类更改有何建议?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我使用Parquet(http://parquet.incubator.apache.org/)取得了很好的经验。他们还提供猪存储和装载机。 Loader允许指定您想要读取数据的特定模式,其中将填充数据中不可用的字段(具有一些简单形式的模式演变)。在您的情况下,您需要首先将数据转换为Parquet格式,但它应该像您期望的那样工作。