避免个别行在 Pig 中的 ToDate 中出现异常

Posted

技术标签:

【中文标题】避免个别行在 Pig 中的 ToDate 中出现异常【英文标题】:Avoid exception in ToDate in Pig for individual rows 【发布时间】:2016-07-01 14:26:01 【问题描述】:

我有一个 CSV 文件的输入,我正在尝试用 Pig 处理它。在 csv 中,有一个日期列,其中包含某些行的损坏值。在我将 ToDate() 函数应用于 FOREACH...GENERATE 语句中的日期列之前,请建议我一种机制来过滤掉那些损坏的行(具有损坏的日期列)。

我的数据的示例格式是:

A,21,12/1/2010 8:26 B,33,12/1/2010 8:26 C,42,我被破坏了 D,30,12/1/2013 9:26

我希望能够加载它,然后将其转换为:

假设 csv 文件被加载到 Y(name,id,date)

X = FOREACH Y GENERATE ToDate(date, 'mm/dd/yyyy HH:mm') AS newdate;

我想在上面的语句之前应用FILTERY 以过滤掉以C 开头的行。因为照原样,上面的语句抛出异常并且当我DUMP X; 时作业失败。

【问题讨论】:

我能想到的最明显和最直接的方法就是按字段的长度进行过滤。除此之外,您还可以编写一个 UDF 来捕获异常。 【参考方案1】:

ToDate 失败的两种情况,

1) 当日期丢失或语法错误时, 使用正则表达式过滤所有日期,

X = FILTER Y BY (date matches '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/');

2) 当日期落入您所在时区的 DST (https://en.wikipedia.org/wiki/Daylight_saving_time) 时。您必须手动过滤。

【讨论】:

以上是关于避免个别行在 Pig 中的 ToDate 中出现异常的主要内容,如果未能解决你的问题,请参考以下文章

带有 ToDate 内置函数的 PIg- NullPointerException

Pig 脚本到日期转换问题导致不同的输出

猪在 3 月份给出错误结果的天数

当数据网格行在网格中不可见时,如何避免空引用异常?

将 Parquet 数据加载到 PIG 时如何避免 UnsatisfiedLinkError

在 Pig 中出现错误为“错误编译运算符 POLocalRearrange”