hive用timestamp类型的时间与string类型比较大小时遇到的坑

SELECT 
    date_format(a.start_time, 'yyyy-MM-dd') AS `date`,
    COUNT(*) AS `排课课节数`,
    SUM(a.stu_num) AS `排课学生人次`,
    count(case when a.category=0 then 1 end) as `1v1课节数`,
    sum(case when a.category=0 then a.stu_num end) as `1v1学生人次`,
    count(case when a.category=7 then 1 end) as `小班课课节数`,
    sum(case when a.category=7 then a.stu_num end) as `小班课学生人次`,
    count(case when a.category in (1,2) then 1 end) as `大班课课节数`,
    sum(case when a.category in (1,2) then a.stu_num end) as `大班课学生人次`
FROM 
    epg_ods.zby_api_cloudclass_lesson a
WHERE 
    a.start_time > CURRENT_DATE()
     AND a.start_time < date_sub(CURRENT_DATE(),-8)
    AND a.deleted_at is NULL
GROUP BY date_format(a.start_time, 'yyyy-MM-dd')
ORDER BY `date` ASC;

报错

Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

后来去yarn上看了下日志

Caused by: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.lang.String
	at java.lang.String.compareTo(String.java:111)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.compareToRange(RecordReaderImpl.java:2295)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.evaluatePredicateRange(RecordReaderImpl.java:2444)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.evaluatePredicate(RecordReaderImpl.java:2383)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.pickRowGroups(RecordReaderImpl.java:2595)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.readStripe(RecordReaderImpl.java:2658)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.advanceStripe(RecordReaderImpl.java:3095)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.advanceToNextRow(RecordReaderImpl.java:3137)
	at org.apache.hadoop.hive.ql.io.orc.RecordReaderImpl.<init>(RecordReaderImpl.java:289)
	at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.rowsOptions(ReaderImpl.java:566)
	at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.createReaderFromFile(OrcInputFormat.java:227)
	at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$OrcRecordReader.<init>(OrcInputFormat.java:159)
	at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.getRecordReader(OrcInputFormat.java:1027)
	at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.<init>(CombineHiveRecordReader.java:68)
	... 16 more```

之后逐个条件去注释测试,后来发现将where的 a.start_time < date_sub(CURRENT_DATE(),0)条件注释掉就ok了

```sql
SELECT 
    date_format(a.start_time, 'yyyy-MM-dd') AS `date`,
    COUNT(*) AS `排课课节数`,
    SUM(a.stu_num) AS `排课学生人次`,
    count(case when a.category=0 then 1 end) as `1v1课节数`,
    sum(case when a.category=0 then a.stu_num end) as `1v1学生人次`,
    count(case when a.category=7 then 1 end) as `小班课课节数`,
    sum(case when a.category=7 then a.stu_num end) as `小班课学生人次`,
    count(case when a.category in (1,2) then 1 end) as `大班课课节数`,
    sum(case when a.category in (1,2) then a.stu_num end) as `大班课学生人次`
FROM 
    epg_ods.zby_api_cloudclass_lesson a
WHERE 
    a.start_time > CURRENT_DATE()
    --  AND a.start_time < date_sub(CURRENT_DATE(),-8)
    AND a.deleted_at is NULL
GROUP BY date_format(a.start_time, 'yyyy-MM-dd')
ORDER BY `date` ASC;

在这里插入图片描述
我想了一个方法就是将 a.start_time < date_sub(CURRENT_DATE(),0)这个条件转换成左边为date类型再去比较,发现成功了

SELECT 
    date_format(a.start_time, 'yyyy-MM-dd') AS `date`,
    COUNT(*) AS `排课课节数`,
    SUM(a.stu_num) AS `排课学生人次`,
    count(case when a.category=0 then 1 end) as `1v1课节数`,
    sum(case when a.category=0 then a.stu_num end) as `1v1学生人次`,
    count(case when a.category=7 then 1 end) as `小班课课节数`,
    sum(case when a.category=7 then a.stu_num end) as `小班课学生人次`,
    count(case when a.category in (1,2) then 1 end) as `大班课课节数`,
    sum(case when a.category in (1,2) then a.stu_num end) as `大班课学生人次`
FROM 
    epg_ods.zby_api_cloudclass_lesson a
WHERE 
    a.start_time > CURRENT_DATE()
      AND date(a.start_time) < date_sub(CURRENT_DATE(),-8)
    AND a.deleted_at is NULL
GROUP BY date_format(a.start_time, 'yyyy-MM-dd')
ORDER BY `date` ASC;

在这里插入图片描述
总结如下:hive用timestamp类型的时间与string类型比较大小时,需要将timestamp类型转成date类型再去比较。(方法不唯一,应该是只要能进行自动类型转换就可以比较)

后续发现
timestamp与date类型可以直接比较,与string类型的比较会报错

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Hive中将timestamp转化为string可以使用from_unixtime函数,示例如下: SELECT from_unixtime(timestamp_column, 'yyyy-MM-dd HH:mm:ss') as string_column FROM table_name; 其中,timestamp_column为timestamp类型的列名,table_name为表名,string_column为转化后的string类型列名。在函数中,'yyyy-MM-dd HH:mm:ss'为转化后的string类型的格式,可以根据需要自行调整。 ### 回答2: Hivetimestamp类型可以表示一个日期和时间,但在一些情况下我们需要将其转化为字符串进行处理和展示。下面我们介绍两种方法实现这个转化。 方法一:使用from_unixtime函数 Hive提供了一个from_unixtime函数用于将Unix时间戳转换为可读日期时间格式。Unix时间戳是相对于1970年1月1日00分0秒的秒数。我们可以将timestamp类型转换为Unix时间戳,再使用from_unixtime函数将其转换为字符串,例如: select from_unixtime(unix_timestamp('2022-02-14 10:30:00', 'yyyy-MM-dd HH:mm:ss')) as str_time; 上述代码中,'2022-02-14 10:30:00'是一个字符串类型时间,通过unix_timestamp函数将其转化为Unix时间戳,再使用from_unixtime将其转换为字符串类型。 方法二:使用date_format函数 Hive也提供了一个date_format函数用于将日期时间格式转化为指定的字符串输出格式。语法为:date_format(timestamp, string_pattern),其中timestamp是需要转换的时间戳,string_pattern是目标字符串格式。例如: select date_format('2022-02-14 10:30:00', 'yyyy-MM-dd HH:mm:ss') as str_time; 上述代码中,'2022-02-14 10:30:00'是一个字符串类型时间,date_format函数将其转换为指定格式字符串。 两种方法都可以将timestamp类型转换为字符串类型。需要注意的是,在使用from_unixtime函数或date_format函数,输入的参数必须是时间类型。如果参数是字符串类型,则需要先通过unix_timestamp函数将其转换为时间类型。同,需要确定目标字符串输出格式,以适合具体的需求。 ### 回答3: Hive中的timestamp类型是用于表示日期和时间的一种数据类型。它通常以“yyyy-MM-dd HH:mm:ss.SSS”格式存储在Hive中,其中“yyyy”表示年份,“MM”表示月份,“dd”表示日期,“HH”表示小,“mm”表示分钟,“ss”表示秒,“SSS”表示毫秒。如果想将timestamp类型转换为string类型,则可以使用Hive内置的date_format函数,将timestamp转换为指定格式的字符串。 语法如下: ~~~sql select date_format(timestamp_expression, format) from table_name; ~~~ 其中,timestamp_expression是要转换为字符串的timestamp值,format是转换后字符串的格式。 例如,要将timestamp类型转换为“yyyy年MM月dd日 HH:mm:ss”格式的字符串,可以使用以下SQL查询: ~~~sql select date_format(timestamp_column, 'yyyy年MM月dd日 HH:mm:ss') from table_name; ~~~ 如果需要将timestamp类型转换为其他格式的字符串,只需更改format参数即可。需要注意的是,format参数必须是一个符合Java SimpleDateFormat规范的有效日期时间格式字符串。 除了使用date_format函数外,还可通过使用cast函数将timestamp转换为string。语法如下: ~~~sql select cast(timestamp_expression as string) from table_name; ~~~ 这种方法虽然简单,但是转换后的字符串格式将完全按照timestamp默认格式:“yyyy-MM-dd HH:mm:ss.SSS”显示。如果需要自定义格式,则还是推荐使用date_format函数。 在实际使用中,需要根据具体情况选择合适的方法进行转换。无论是使用date_format函数还是cast函数,转换后的结果都可以在Hive中进行输出、存储等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值