使用pigstorage加载缺少最后一个字段的数据

bq3bfh9z  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(218)

我在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别名中只有2014-12-23开始的数据可用 MYDATA :

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宏中,以便从多个脚本中使用日志数据,在宏中添加新字段会破坏加载的不是最新数据的脚本。
您对处理数据方案的这种变化有什么建议?
谢谢你的帮助。

cyvaqqii

cyvaqqii1#

我用Parquet地板有很好的经验(http://parquet.incubator.apache.org/). 他们还提供生Pig仓库和装载机。loader允许您指定要读取数据的特定模式,该模式将用null(模式演化的一些简单形式)填充数据中不可用的字段。在您的例子中,您需要首先将数据转换为parquet格式,但它应该像您期望的那样工作。

相关问题