spark sql 处理时间类型

来源:互联网 发布:mac rar解压软件下载 编辑:程序博客网 时间:2024/06/08 16:25

近期研究了下spark sql。

发现这scala 与 sql 混写的套路很酷炫呀!

 

一开始就出现了有点小坑爹的问题,相当于自己又涨了一点经验值,嘿嘿

 

这个问题也是在数据库中操作很常见的一个问题。

我们怎么处理时间类型的数据呢?

 

比如:

1、时间类型应用

2、时间类型运算

3、时间类型小时级别运算

 

 


 

 

时间类型应用

 

先看了看官网,说是支持timestamp类型的格式操作

 

我们再找找有木有操作demo呢

结果,最后就一个这

坑爹呀,官方没提供操作demo

怎么对我这个小白这么无情。555

 

算了,直接代码里面尝试吧

 

在配置前,需要引用一下类型的包

importorg.apache.spark.sql.types._

 

在自定义schema的时候,可以设置每个字段的数据类型,这里我们可以把时间字段设置成TimestampType数据类型,见下图

 

 

来走点数据,看看能不能操作

 

结果报错

java.lang.String is not a valid external type for schema of timestamp

 

看这个意思,像是类型的问题。

 

郁闷了好久,找了半天发现,最后在官方文档中发现

这个TimestampType其实就是调用java的 java.sql.Timestamp

卧槽,那我可以看看java里面的怎么操作呀

 

最后需要调用一下valueOf方法就不报错了

 

 


 

 

时间类型运算

 

另外一个问题,spark sql 处理时间类型 做简单运算

我怎么对时间格式做加减法呢?

 

既然是sql,我们先找找sql是怎么做的

( cast(end_time as date)-cast(start_time as date) )*24*3600

 

相当于把字段 as date了,就可以做运算了

 

spark sql 里能不能行呢?

 

结果出错

spark sql time 做减法的错误

 

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '(CAST(bbb.`START_TIME` AS DATE) - CAST(bbb.`END_TIME` AS DATE))'

 

due to data type mismatch: '(CAST(bbb.`START_TIME` AS DATE) - CAST(bbb.`END_TIME` AS DATE))' requires (numeric or calendarinterval) type, not date; line 1 pos 7;

 

最后凭感觉试出来,是数据类型的问题

 

spark.sql("SELECT (cast(END_TIME as long)-cast(START_TIME as long)) totaltime FROM bbb").show()

 

这个as相当于会把Timestamp类型自动转成long

 

 


 

时间类型小时级别运算

 

更多的时候,我们可能需要对时间字段的小时级别,分钟级别进行比对

我们也先看sql是怎么操作的

to_char(start_time, 'yyyymmdd hh24')

 

试试看能不能行

结果出现的错误

Exception in thread "main" org.apache.spark.sql.AnalysisException:

Undefined function: 'to_char'.

This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 24

 

估计没有这个函数

 

最后使用substring函数对时间字段切分后,可以实现比对

substring(START_TIME,12,2) >= 8

 

12 : 开始的下标

2 : 截取的位数