Skip to content Skip to sidebar Skip to footer

Temporal Join In Hive Query (events In Close Proximity In Time)

I have a need for a hive query that I'm having difficulty figuring out. I have a time series that looks like this: time source word1 word2 ...etc 2

Solution 1:

This would be a naive solution:

select*from                    messages c
        crossjoin      messages m 

where   m.time  between c.time -interval'0.001'secondand     c.time +interval'0.001'secondand c.word1 ='2B3B'and m.word2 ='ABAA'
    
;

+----------------------------+--------+-------+-------+----------------------------+--------+-------+-------+
|            time            | source | word1 | word2 |            time            | source | word1 | word2 |
+----------------------------+--------+-------+-------+----------------------------+--------+-------+-------+
| 2012-02-0123:43:16.998824 |   0001 | 2B3B  | FAF0  | 2012-02-0123:43:16.999356 |   0002 |  2326 | ABAA  |
+----------------------------+--------+-------+-------+----------------------------+--------+-------+-------+

This is the solution with the good performance

select*from                    messages c

        join            messages m
        
        onfloor (cast(c.time asdecimal(37,7)) / (2*0.001))   =floor (cast(m.time asdecimal(37,7)) / (2*0.001))

where   m.time  between c.time -interval'0.001'secondand     c.time +interval'0.001'secondand c.word1 ='2B3B'and m.word2 ='ABAA'unionallselect*from                    messages c

        join            messages m
        
        onfloor ((cast(c.time asdecimal(37,7)) +0.001) / (2*0.001))   =floor ((cast(m.time asdecimal(37,7)) +0.001) / (2*0.001))

wherefloor (cast(c.time asdecimal(37,7)) / (2*0.001))     <>floor (cast(m.time asdecimal(37,7)) / (2*0.001))
        
    and m.time  between c.time -interval'0.001'secondand     c.time +interval'0.001'secondand c.word1 ='2B3B'and m.word2 ='ABAA'

+----------------------------+--------+-------+-------+----------------------------+-------+-------+-------+|time|source|word1|word2|_col4|_col5|_col6|_col7|+----------------------------+--------+-------+-------+----------------------------+-------+-------+-------+|2012-02-01 23:43:16.998824|0001|2B3B|FAF0|2012-02-01 23:43:16.999356|0002|2326|ABAA|+----------------------------+--------+-------+-------+----------------------------+-------+-------+-------+

Illustration

Events A and B are going to be caught by the upper part of the UNION ALL. Events B and C are going to be caught by the lower part of the UNION ALL.

    0        0.002    0.004    0.006    0.008    0.01      
    |        |        |        |        |        |
-------------------------------------------------------
                      |        |
                      |        |
                          A  B  C
                           |        |
                           |        |
-------------------------------------------------------
         |        |        |        |        |                
         0.001    0.003    0.005    0.007    0.009

Post a Comment for "Temporal Join In Hive Query (events In Close Proximity In Time)"