嗨,我试图找出Hive中使用TRUNC和TO_DATE之间的区别是什么。

目前在oracle中,我针对以下数据编写了以下case语句:

ORDER_NO | NAME | DATE_ | TASK_NO
ABC123 | Humpty | 07-OCT-16 12:30:54 | 1
ABC123 | Humpty | 07-OCT-16 12:30:54 | 2
ABC123 | Humpty | 07-OCT-16 12:32:20 | 6

SELECT ORDER_NO, NAME, DATE_, TASK_NO
    (CASE WHEN DATE_ - LAG(DATE_) OVER (PARTITION BY ORDER_NO, NAME, TRUNC(DATE_) ORDER BY DATE_) <= 1/48
    THEN 0 ELSE 1 END) AS COUNT1

这给了我结果:
ORDER_NO | NAME | DATE_ | TASK_NO | COUNT1
    ABC123 | Humpty | 07-OCT-16 12:30:54 | 1 | 1
    ABC123 | Humpty | 07-OCT-16 12:30:54 | 2 | 0
    ABC123 | Humpty | 07-OCT-16 12:32:20 | 6 | 1

哪个是对的。现在,如果我在Hive中对我的完整数据集使用相同的查询,则会收到错误消息:
Error while compiling statement: FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns.

因此,我将TRUNC更改为TO_DATE,并且可以正常工作,并给出了以下结果:
SELECT ORDER_NO, NAME, DATE_, TASK_NO
(CASE WHEN DATE_ - LAG(DATE_) OVER (PARTITION BY ORDER_NO, NAME, TO_DATE(DATE_) ORDER BY DATE_) <= 1/48
    THEN 0 ELSE 1 END) AS COUNT1

这给了我结果:
ORDER_NO | NAME | DATE_ | TASK_NO | COUNT1
ABC123 | Humpty | 07-OCT-16 12:30:54 | 1 | 1
ABC123 | Humpty | 07-OCT-16 12:32:20 | 6 | 1
ABC123 | Humpty | 07-OCT-16 12:30:54 | 2 | 1

这与我在Oracle中得到的不同。据我所知,日期值作为日期/时间中排序的结果存储为字符串,这是我认为问题出在哪里,但不确定要修复它需要进行哪些更改。

真的很感谢一些建议。

更新的代码:
SELECT
ORDER_NO
,NAME
,DATE_FIXED
,TASK_NO
,CASE WHEN DATE_UTS - LAG(DATE_UTS) OVER (PARTITION BY ORDER_NO, NAME, TO_DATE(DATE_FIXED) ORDER BY DATE_FIXED) <= 60*30
THEN    0
ELSE    1
END AS COUNT1
FROM
(
SELECT
ORDER_NO
,NAME
,TASK_NO
,FROM_UNIXTIME(UNIX_TIMESTAMP(DATE_, 'DD-MMM-YY HH:MM:SS')) AS DATE_FIXED
,UNIX_TIMESTAMP(DATE_, 'DD-MMM-YY HH:MM:SS') AS DATE_UTS
FROM TABLE1
) T

最佳答案

1个
Hive Operators and User-Defined Functions (UDFs)



2个
您的原始查询有误

  • TASK_NO(CASE WHEN之间没有逗号
  • Hive中的
  • Trunc必须采用1个参数,并且一天中没有任何参数。
  • 日期没有负号运算符(并且绝对不是字符串)。结果为NULL。

  • 3
    Hive中唯一可识别的日期格式是 YYYY-MM-DD ,它与您的数据不匹配。
    在无效字符串上应用日期函数将导致NULL。
    这是将数据格式转换为日期的方法:
    hive> select from_unixtime(unix_timestamp('07-OCT-16 12:30:54','dd-MMM-yy HH:mm:ss'));
    OK
    2016-10-07 12:30:54
    

    和整个查询:
    select  ORDER_NO
           ,NAME
           ,DATE_fixed
           ,TASK_NO
    
           ,case
                when    DATE_uts
                    -   LAG(DATE_uts) OVER
                        (
                            PARTITION BY    ORDER_NO,NAME,to_date(DATE_fixed)
                            ORDER BY        DATE_fixed
                        )
                    <= 60*30
                then    0
                else    1
            end             AS COUNT1
    
    from   (select  ORDER_NO
                   ,NAME
                   ,TASK_NO
                   ,from_unixtime(unix_timestamp(DATE_,'dd-MMM-yy HH:mm:ss'))   as DATE_fixed
                   ,unix_timestamp(DATE_,'dd-MMM-yy HH:mm:ss')                  as DATE_uts
    
            from    t
            ) t
    ;
    
    ABC123  Humpty  2016-10-07 12:30:54 2   1
    ABC123  Humpty  2016-10-07 12:30:54 1   0
    ABC123  Humpty  2016-10-07 12:32:20 6   0
    

    这也是我在Oracle 上对其进行测试时的结果

    关于sql - Hive中的TRUNC和TO_DATE有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41285594/

    10-16 16:03