我有一个 CSV 文件输入,我正在尝试使用 Pig 对其进行处理。在 csv 中,有一个日期列,其中包含某些行的损坏值。在将 ToDate() 函数应用于 FOREACH...GENERATE
语句中的日期列之前,请建议我一种机制来过滤掉那些损坏的行(具有损坏的日期列)。
我的数据的示例格式是:
A,21,12/1/2010 8:26
B,33,12/1/2010 8:26
C,42,i am corrupted
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;
我想在上面的语句之前对 Y
应用一个 FILTER
来过滤掉以 C 开头的行。因为,按原样,上面的语句会抛出异常并且作业当我DUMP X;
时失败。
最佳答案
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 ) 时。您必须手动过滤它。
关于csv - 避免 Pig 中的 ToDate 中个别行出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38147906/