[ https://issues.apache.org/jira/browse/PIG-953?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12753816#action_12753816 ]
Pradeep Kamath commented on PIG-953: ------------------------------------ Response to previous comment: Dmitriy: seekNear seems ambiguous, as "near" is a generic concept that does not necessarily imply "before or to, but not after" - which is what this method is required to do. How about "seekBefore()"? Pradeep: I had initially thought of naming this method seekBefore(). However for the case where the key we are using to seek not being present in the right input, the loader can either position at the biggest value before the key OR the smallest value after the key (zebra loader for example can only do the latter). The name "seekBefore" suggests that implementations should always seek before the key in question - hence I chose seekNear. Dmitriy: it looks like the large diff blocks in MergeSort et al are mostly moves of code blocks, not significant code changes, correct? Pradeep: I am assuming you meant POMergeJoin - yes - its mostly code move to DefaultIndexableLoader Dmitriy: Why does getAscColumns and getSortColumns make a copy of the list? Seems like we can save some memory and cpu here. Pradeep: Findbugs complains about passing internal members as is in getters since the caller can then modifiy these internal members - hence the copy. This should not be a performance/memory issue since these copies are 1) on small structures 2) in front end at compile time and not at runtime. Dmitriry: For that matter, why not use a map of (String)colName-> (Boolean)ascending instead of 2 lists? One structure, plus O(1) lookup. Pradeep: This suggestion is reasonable - I picked the current implementation since its inline with how these things are represented today in LOSort. Unless the user of SortInfo does lookup using sort column names, we won't get O(1). I designed this keeping zebra's use case (which is the only use case at this point) and the zebra store function would basically needs to know the sort keys in order and which of them are asc/dsc. For this they would iterate over our datastructure and require that the ordering of the keys match the primary/secondary order of the sort keys - hence a list lends itself better for that. I debated using a List<Pair<String,Boolean>> but thought I can avoid Pair since its a pig implementation class (if tomorrow zebra wants to expose the same SortInfo to its users). Dmitriy: Not sure about the use of super() in the constructor of a class that doesn't extend anything but Object. Is there some magic that requires it? Pradeep: This was unintended - all thanks to eclipse :) - will remove it a next iteration of this patch Dmitriy: In Log2PhysTranslator, why hardcode the Limit operator? There are other operators that don't change sort order, such as filter. Perhaps add a method to Logical Operators that indicates if they alter sort order of their inputs? Pradeep: Pig only guarantees order with limit following order - for any other relational operator following order there are no guarantees. Today it is true that filter or a column pruning foreach would also preserve order but this can change if needed in the future. There explicit code to ensure order-limit combination works by preserving order - there is no such explicit check for other operators (keeping it open for change in the future) Dmitriy: Even with this rewrite, this seems like an odd function. It being as odd as it is leads to it not being used safely when you set checkEquality to false (just a few lines later)-- if obj1 is null and obj2 is not, the func returns true, you try to call a method on obj1, and get an NPE. Pradeep: The rewrite is more terse and is another option as against the explicit if-else I have - more a coding style issue than correctness. The idea of having this function was to serve as a helper for use in Classes which need to implement equals(). It is cumbersone that every new class's equals has to do the equivalent of what you suggest: {code} Util.bothNull(obj1, obj2) || (Util.notNull(obj1, obj2) && obj1.equals(obj2)); {code} This one method can be used either to only check that both objects are not null OR to do that and additionally check equality. Not sure I understand the oddity - am I missing something? Dmitriy: This comment has a typo (and instead of "an"): Pradeep: Will fix in next iteration > Enable merge join in pig to work with loaders and store functions which can > internally index sorted data > --------------------------------------------------------------------------------------------------------- > > Key: PIG-953 > URL: https://issues.apache.org/jira/browse/PIG-953 > Project: Pig > Issue Type: Improvement > Affects Versions: 0.3.0 > Reporter: Pradeep Kamath > Assignee: Pradeep Kamath > Attachments: PIG-953.patch > > > Currently merge join implementation in pig includes construction of an index > on sorted data and use of that index to seek into the "right input" to > efficiently perform the join operation. Some loaders (notably the zebra > loader) internally implement an index on sorted data and can perform this > seek efficiently using their index. So the use of the index needs to be > abstracted in such a way that when the loader supports indexing, pig uses it > (indirectly through the loader) and does not construct an index. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.