[ https://issues.apache.org/jira/browse/HIVE-896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13558058#comment-13558058 ]
Harish Butani commented on HIVE-896: ------------------------------------ 1. This is only true as long as you have only one OVER clause, right? As soon as you add the ability to have separate OVER clauses partitioning by different keys (which users will want very soon) you lose this identity. Even if you decide to retain this I would argue that the standard PARTITION BY/ORDER BY syntax should be accepted as well. HQL already has enough one off syntax that makes life hard for people coming from more standard SQL. It should not be exacerbated. I am agnostic about the second point. We can support Partition/Order or Distribute/Sort or both... Regarding the first point, no it applies beyond having the same partitioning. If you say something like: select p_mfgr, p_name, sum(p_size) over (distribute by p_mfgr sort by p_name rows between unbounded preceding and current row) from part distribute by p_mfgr sort by p_name; This is allowed in the language; if we don't relate windowing to the distribute/sort, this means do the Windowing and then do the distribute/sort. I doubt this would ever be what the user intended. So we propose to associate the distribute/sort with windowing; and use it at as the 'default' partitioning specification. So we allow a Query to be specified this way: select p_mfgr, p_name, sum(p_size) over (rows between unbounded preceding and current row) from part distribute by p_mfgr sort by p_name; The concept of inheriting the default partitioning still works even when we allow different partitioning specifications. So in the future this will be how you specify multiple ordering: select p_mfgr, p_name, sum(p_size) over ( rows between unbounded preceding and current row), sum(p_retailprice) (sort by p_size rows between unbounded preceding and current row) from part distribute by p_mfgr sort by p_name; Similarly you can have multiple distribute specs. 2. This is part of where I was going with my earlier question on why a windowing function would ever return a partition. I am becoming less convinced that it makes sense to combine windowing and partition functions. While they both take partitions as inputs they return different things. Partition functions return partitions and windowing functions return a single value. As you point out here the partition functions will also not be interested in the range limiting features of windowing functions. But taking advantage of this in windowing functions will be very important for performance optimizations, I suspect. At the very least it seems like partitioning functions and windowing functions should be presented as separate entities to users and UDF writers, even if for now Hive shares some of the framework for handling them underneath. This way in the future optimizations and new features can be added in a way that is advantageous for each. There are several points here. a. Windowing doesn't return a single value. The output of applying a WindowFunction on a Partition is a Column with the same number of rows as the partition. b. The combined output of all the WIndow Functions in a Statement is a Partition that combines output from the individual Wdw Functions. Now let me say something about the seperation of Windowing and PTF functionality. There are 4 areas: a. The Language level: there is no intersection. The user will not see the connection. One is used as a UDAF; the other whereever tables can appear. b. The Ifc/Function writer level: there is no intersection. There is no 'Window Function'; a UDAF writer can continue to write UDAFs. They automatically become available in Window expressions. Table Functions are written using the TableFunctionResolver and Evaluator ifcs. This is very different from writing a UDAF. (We have setup a functions branch; you will see some egs of TblFuncs, past the pedantic Noop and NoopWithMap; also we were hoping to add NPath into the first patch). c. The Query Specification Level: Here things get a little messy. First let me describe the situation, and then how it is relatively eay to fix. We have extended the QueryBlock(QB) to have the following information(per destination): - a map of PTF invocations. These are any PTF invocations that appear in the from clause. Roughly equivalent to how SubQuery information is captured in the QB. This information is held in an instance of PTFSpec; which captures all the details of the PTF invocation. - a destination may also have a PTFSpec attached which represents the Windowing processing associated with this QB destination. Here is where things need correction. Our implementation details are leaking into the Specification classes. Since today we use the PTFOp to execute windowing we are capturing the windowing clauses information in a PTFSpec. But it is relatively easy to correct this. We can have a different set of classes to capture the Window processing. c.2. The other place where the implemenation is leaking is how we try to optimize Windowing processing when it is combined with a PTF invocation. (this may be too much detail; the gist of this point is that this too is easily fixable; if not interested skip to point d.) When we see that the from clause is only a PTF invocation then we associate the windowing clauses with its PTFSpec; so as to treat both things as one PTF Chain. Once in a chain we use our PTF Chain breaking logic to decide whether Windowing can be done in the same PTFOp for we need to break them. Again this is relatively easy to fix; for now we remove the logic that trys to associate a Windowing processing with an existing PTFSpec on the QB. This keeps the translation clean; the decision to combine can be pushed off to a later stage. d. The execution of Windowing: think of PTFOperator as an implementaion for Windowing. With the changes above, it will be easy to choose other available implementaions in the future. Finally the execution of Windowing by the PTFOp has some uses: d.1 - the handling of value based ranges: it is more work to predict the boundary of the window; and sometimes it may just make sense to keep the whole partition. For e.g.: select p_mfgr,p_name, p_size, sum(p_size) as s2 over (range between p_size 5 less and current row), from part distribute by p_mfgr sort by p_mfgr, p_name; The tradeoff is doing the window calculation for each row to decide how much to keep around vs just keeping the whole thing(spilled to disk if needed) d.2 The support for multiple ordering, with the same partition is possible by doing just one shuffle and then doing a sort of the PersistentPartitionedList backing the Partition. This is much easier to support then to invoke multiple MR jobs and assemble the output into a final Partition. > Add LEAD/LAG/FIRST/LAST analytical windowing functions to Hive. > --------------------------------------------------------------- > > Key: HIVE-896 > URL: https://issues.apache.org/jira/browse/HIVE-896 > Project: Hive > Issue Type: New Feature > Components: OLAP, UDF > Reporter: Amr Awadallah > Priority: Minor > Attachments: HIVE-896.1.patch.txt > > > Windowing functions are very useful for click stream processing and similar > time-series/sliding-window analytics. > More details at: > http://download-west.oracle.com/docs/cd/B13789_01/server.101/b10736/analysis.htm#i1006709 > http://download-west.oracle.com/docs/cd/B13789_01/server.101/b10736/analysis.htm#i1007059 > http://download-west.oracle.com/docs/cd/B13789_01/server.101/b10736/analysis.htm#i1007032 > -- amr -- 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