[
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