我在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宏中,用于从多个脚本中使用日志数据,在宏中添加新字段会破坏我的脚本,这些脚本正在加载不那么新的数据。
您对处理数据方案中的此类更改有何建议?
感谢您的帮助。
答案 0 :(得分:0)
我使用Parquet(http://parquet.incubator.apache.org/)取得了很好的经验。他们还提供猪存储和装载机。 Loader允许指定您想要读取数据的特定模式,其中将填充数据中不可用的字段(具有一些简单形式的模式演变)。在您的情况下,您需要首先将数据转换为Parquet格式,但它应该像您期望的那样工作。