2014-09-13 4 views
0

моего входного файлаHadoop по сравнению с предыдущим с UDF из

2014-08-23  30000 
2014-09-24  20000 
2014-10-23  50000 
2014-11-24  7000 

Я хочу, чтобы результат, как этот

2014-08-23  30000 
2014-09-24  -10000 
2014-10-25  30000 
2014-11-24  -47000 

Я хочу, чтобы достичь этой цели без UDF.
Я попробовал этот код

SELECT C.ID ,C.DATE,C.VALUE AS CURRENT_DATE_VALUE,COALESCE(CAST(O.VALUE AS INT),0) AS PREV_DATE_VALUE,(C.VALUE-COALESCE(CAST(O.VALUE as INT),0)) AS DIFF_VALUE 
FROM ITEM O 
LEFT OUTER JOIN 
(SELECT T.ID ,C.DATE,C.VALUE,MAX(UNIX_TIMESTAMP(T.DATE,'dd-MM-yyyy')) AS PREV_DATE 
    FROM ITEM C 
    LEFT OUTER JOIN ITEM T ON(C.ID = T.ID) WHERE 
    UNIX_TIMESTAMP (C.DATE,'dd-MM-yyyy') > UNIX_TIMESTAMP(T.DATE,'dd-MM-yyyy') GROUP BY 
    T.ID ,C.DATE,C.VALUE) C 
ON (O.ID = C.ID AND UNIX_TIMESTAMP (O.DATE,'dd-MM-yyyy') = C.PREV_DATE) 
+0

Как вы получаете '-47000' в последней строке? – gobrewers14

ответ

0

Вы можете сделать это с минимальным количеством кода, если у вас есть доступ к Hive 0.13 (который имеет windowing функции)

Запрос:

select date 
    ,(value - prev) as diff 
from (
    select date 
     ,value 
     ,LAG(value, 1, 0) OVER (ORDER BY date) as prev 
    from some_database.some_table 
    ) x 

Выход:

2014-08-23 30000 
2014-09-24 -10000 
2014-10-23 30000 
2014-11-24 -43000