使用 PigStorage 加载缺少最后一个字段的数据
Posted
技术标签:
【中文标题】使用 PigStorage 加载缺少最后一个字段的数据【英文标题】:Load data using PigStorage with last fields missing 【发布时间】:2015-01-21 15:12:31 【问题描述】:我在 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】:我在使用 Parquet (http://parquet.incubator.apache.org/) 方面取得了很好的经验。他们还提供猪存储和装载机。 Loader 允许指定要读取数据的特定模式,其中将用 NULL 填充数据中不可用的字段(某种简单的模式演变形式)。在您的情况下,您需要先将数据转换为 Parquet 格式,然后它应该可以按照您的预期工作。
【讨论】:
以上是关于使用 PigStorage 加载缺少最后一个字段的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用不同的 PigStorage 运算符将数据加载到猪中