spark dataframe的时间类型和String类型转化

56 篇文章 4 订阅
47 篇文章 3 订阅

spark sql中的时间转换函数是调用Hive来进行操作,所以spark sql和hql的用法是一致的。


hive中的时间格式规定为:

默认格式是 yyyy-MM-dd HH:mm:ss

yyyy 年 可简化为yy
MM 月 可简化为M
dd 日 可简化为d

HH 小时 可简化为H
mm 分钟 可简化为m
ss 秒 可简化为s

其中,除了秒大小写 通用外, 其他计时单位 大小写不通用 如果写错 则输出 null。

本次介绍三个函数分别是:

1.to_date(列名, ‘yyyy/MM/dd HH:mm:ss’) 返回 Date类型

将string类型字段转化为date 标准格式为"yyyy-MM-dd"(spark的date格式精确到天)

其中"yyyy/MM/dd HH:mm:ss" 为列数据本身的格式 可以不符合常见的时间定义格式 如

  • 注 : 无论你写不写 时分秒 格式,spark中的date格式 都精确到分钟 即 我的输入为 2020~10/10 10:10:10 经过to_date后 变成 2020-10-10 具体可参考下文中的例子

2.date_format(列名, ‘yyyy/MM/dd HH:mm:ss’) 返回String类型

将时间标准格式按照自定义输入格式进行转化。若包含 时分秒 则以0代替。

输入类型可以自己定义,如"yyyy=MM=dd HH/mm:ss"

3.to_timestamp(列名) 返回Timestamp类型

将标准时间格式(yyyy-MM-dd)数据(既可以是String类型,也可以是Date类型) 转化为标准时间戳类型:“yyyy-MM-dd HH-mm-ss” 没有时分秒 则自动补0

例:

import spark.implicits._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql.DataFrame


var data = Seq(
  ("0", "ming", "tj","2019~09-06 17:15:15", "2002"),
  ("0", "haha", "hegang","2019~09-08 15:15:15", "10010")
).toDF("label", "name", "live","START_TIME", "AMOUNT")

data.show()

在这里插入图片描述

使用 to_date() 函数

data.createOrReplaceTempView("data")
var colName = "START_TIME"

var test1 = spark.sql(s"select to_date($colName, 'yyyy~MM-dd HH:mm:ss') as times from data")
test1.show()

var type_test1 = test1.dtypes
type_test1.foreach(println)

在这里插入图片描述

to_date不仅能在sparksql中使用,也可以作为函数,如下所示:
var test2 = data.withColumn(colName,(to_date(col(colName),"yyyy~MM-dd HH:mm:ss")))

test2.show()

var type_test2 = test2.dtypes
type_test2.foreach(println)

在这里插入图片描述

使用date_format() 函数

var test3 = spark.sql(s"select date_format(to_date($colName, 'yyyy~MM-dd HH:mm:ss'),'yyyy=MM=dd HH/mm:ss') as times from data")
test3.show()

var type_test3 = test3.dtypes
type_test3.foreach(println)

在这里插入图片描述

date_format不仅能在sparksql中使用,也可以作为函数,如下所示:
var test4 = data.withColumn(colName,(date_format(to_date(col(colName),"yyyy~MM-dd HH:mm:ss"), "yyyy/MM/dd HH:mm:ss")))

test4.show()

var type_test4 = test4.dtypes
type_test4.foreach(println)

在这里插入图片描述

使用to_timestamp() 函数

构建表data1, 时间格式为标准格式,类型为String:

在这里插入图片描述


data1.createOrReplaceTempView("data1")
var colName = "START_TIME"




var test5 = spark.sql(s"select to_timestamp(to_date($colName,'yyyy-MM-dd HH:mm:ss'))  as times from data1")

// 与上面运行结果一直
// var test5 = spark.sql(s"select to_timestamp($colName)  as times from data1")

// 将TimestampType 转为StringType
// var test5 = spark.sql(s"select cast(to_timestamp($colName) as String)  as times from data1")

test5.show()

var type_test5 = test5.dtypes
type_test5.foreach(println)

在这里插入图片描述

to_timestamp不仅能在sparksql中使用,也可以作为函数,如下所示:

// var test6 = data1.withColumn(colName,(to_timestamp(col(colName))))

// 将TimestampType 转为StringType
var test6 = data1.withColumn(colName, col(colName).cast(StringType))


test6.show()

var type_test6 = test6.dtypes
type_test6.foreach(println)

在这里插入图片描述

参考资料:

1.https://www.cnblogs.com/mylittlecabin/p/11692363.html

2.https://stackoverflow.com/questions/40763796/convert-date-from-string-to-date-format-in-dataframes

3.https://www.nuomiphp.com/eplan/29850.html

4.https://stackoverflow.com/questions/40763796/convert-date-from-string-to-date-format-in-dataframes

5.https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions

6.https://www.jianshu.com/p/a87ac9f827e4

7.https://cloud.tencent.com/developer/ask/225235

8.https://blog.csdn.net/qq_33283716/article/details/81043264

在这里插入图片描述

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值