[
https://issues.apache.org/jira/browse/PIG-3341?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13681840#comment-13681840
]
pat chan commented on PIG-3341:
-------------------------------
Just to be clear, although the parser is "strict", meaning it won't accept
non-iso8601 formats, it is not a complete parser. It actually only accepts a
small fraction of the iso8601 standard.
When I was trying to work with dates, I couldn't tell what formats were
accepted. For example, the documentation suggests that yyyyMMdd would be
accepted (since it was listed in the iso8601 reference) but I couldn't get it
work. If possible, it would be great if the docs either said
- supports all of the w3c profile and a few undocumented iso8601-compliant
formats
- or literally specify the accepted formats.
Either would help clear up the documentation around formats quite a bit.
> Strict datetime parsing and improve performance of loading datetime values
> --------------------------------------------------------------------------
>
> Key: PIG-3341
> URL: https://issues.apache.org/jira/browse/PIG-3341
> Project: Pig
> Issue Type: Improvement
> Components: impl
> Affects Versions: 0.11.1
> Reporter: pat chan
> Assignee: Rohini Palaniswamy
> Fix For: 0.12, 0.11.2
>
> Attachments: PIG-3341-1.patch, PIG-3341-2.patch, PIG-3341-3.patch
>
>
> The performance of loading datetime values can be improved by about 25% by
> moving a single line in ToDate.java:
> public static DateTimeZone extractDateTimeZone(String dtStr) {
> Pattern pattern =
> Pattern.compile("(Z|(?<=(T[0-9\\.:]{0,12}))((\\+|-)\\d{2}(:?\\d{2})?))$");;
> should become:
> static Pattern pattern =
> Pattern.compile("(Z|(?<=(T[0-9\\.:]{0,12}))((\\+|-)\\d{2}(:?\\d{2})?))$");
> public static DateTimeZone extractDateTimeZone(String dtStr) {
> There is no need to recompile the regular expression for every value. I'm not
> sure if this function is ever called concurrently, but Pattern objects are
> thread-safe anyways.
> As a test, I created a file of 10M timestamps:
> for i in 0..10000000
> puts '2000-01-01T00:00:00+23'
> end
> I then ran this script:
> grunt> A = load 'data' as (a:datetime); B = filter A by a is null; dump B;
> Before the change it took 160s.
> After the change, the script took 120s.
> ----------------
> Another performance improvement can be made for invalid datetime values. If a
> datetime value is invalid, an exception is created and thrown, which is a
> costly way to fail a validity check. To test the performance impact, I
> created 10M invalid datetime values:
> for i in 0..10000000
> puts '2000-99-01T00:00:00+23'
> end
> In this test, the regex pattern was always recompiled. I then ran this script:
> grunt> A = load 'data' as (a:datetime); B = filter A by a is not null; dump
> B;
> The script took 190s.
> I understand this could be considered an edge case and might not be worth
> changing. However, if there are use cases where invalid dates are part of
> normal processing, then you might consider fixing this.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira