gpt4 book ai didi

sql - Hive 中的 TRUNC 和 TO_DATE 有什么区别

转载 作者:可可西里 更新时间:2023-11-01 14:20:54 27 4
gpt4 key购买 nike

您好,我想找出在 Hive 中使用 TRUNC 和 TO_DATE 之间的区别。

目前在 oracle 中,我针对下面显示的数据编写了以下案例语句:

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)

to_date

Returns the date part of a timestamp string (pre-Hive 2.1.0):
to_date("1970-01-01 00:00:00") = "1970-01-01".
As of Hive 2.1.0, returns a date object.
Prior to Hive 2.1.0 (HIVE-13248) the return type was a String because no Date type existed when the method was created.


trunc

Returns date truncated to the unit specified by the format (as of Hive1.2.0).
Supported formats: MONTH/MON/MM, YEAR/YYYY/YY.
Example: trunc('2015-03-17', 'MM') = 2015-03-01.

2

您的原始查询有误

  1. TASK_NO(CASE WHEN
  2. 之间没有逗号Hive中的
  3. Trunc必须带1个参数,day没有参数。
  4. 日期没有减号运算符(当然字符串也没有)。这会导致 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com