1) 官网参考链接:Spark SQL, Built-in Functions
1) 获取2020-07-26两天之内的数据
注意:数据表中的日期格式为yyyMMdd, 日期函数要求的格式为yyyy-MM-dd
// 1 获取SparkSession
val spark = SparkSession
.builder()
.appName("spark_demo")
.master("local[3]")
.getOrCreate()
import spark.implicits._
// 2 构造数据源
val arr=Array("20200725","20200726","20200721")
val df=spark.sparkContext.makeRDD(arr).toDF("dt")
df.createOrReplaceTempView("df")
// 3 写sql展示数据
val sql=
"""
|select dt from df where dt>=date_format(date_sub('2020-07-26', 2),'yyyyMMdd') and dt<=date_format('2020-07-26','yyyyMMdd')
|""".stripMargin
spark.sql(sql).show()
1) 标准格式日期(yyyy-MM-dd 和 yyyy-MM-dd HH:mm:ss.SSSS)
可以通过date_format(date_str,format_str)函数转到任意日期格式。
Examples:> SELECT date_format('2016-04-08', 'yyyyMMdd'); 20160408
2)yyyyMMdd--->yyyy-MM-dd日期格式转换
Examples:> select concat_ws('-',substr('20200726',1,4),substr('20200726',5,2),substr('20200726',7,2));2020-07-26
一 spark中受时区影响的函数
注意: 时区设置方式(默认获取服务器时区)
1. current_date获取当前日期
2018-04-09
2. current_timestamp/now()获取当前时间
2018-04-09 15:20:49.247
3. 从当前时区转换到unix时间戳
SELECT unix_timestamp('2016-04-08', 'yyyy-MM-dd');
1460073600
4. 从unix时间戳转换到当前时区的时间
注意: 第一个参数是10位的时间戳
SELECT from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');
1970-01-01 00:00:00
5. 数字强转到时间戳(转到设定的时区)
select cast(1614815429 as timestamp);
2021-03-04 07:50:296. 日期格式化函数(会进行时区的偏移), 用的时候实测一下
6. 日期格式转换
1) 不受时区影响
SELECT date_format('2016-04-08 18', 'yyyy-MM-dd');
2016-04-09
2) 这种特定时间戳格式受时区影响
select date_format('2021-06-24T22:04:50+00:00', 'yyyy-MM-dd');
2021-06-25
二 spark中不受时区影响的函数
1. 返回当前时间的unix时间戳
SELECT unix_timestamp();
1614237507
2. 时间从指定的时区转换到0时区
SELECT to_utc_timestamp('2009-07-30 22:17:52', 'GMT+1');
2009-07-30 21:17:52
3. 从0时区转换到指定时区
SELECT from_utc_timestamp('2017-07-14 02:40:00.0', 'GMT+1');
2017-07-14 03:40:00
4. 转成日期yyyy-MM-dd
SELECT to_date('2009-07-30 20:17:52');
2009-07-30
5. 日期的加减(最终转成日期格式)
SELECT date_add('2016-07-30 22:12:30', 1);
2016-07-31
三 时区设置
set spark.sql.session.timeZone=GMT+8;
set spark.sql.session.timeZone=UTC;
1 获取周一日期
SELECT date_format(date_trunc('WEEK', '2020-09-15'),'yyyy-MM-dd');
2020-09-14
2 获取季初日期
SELECT date_format(date_trunc('QUARTER', '2020-09-15'),'yyyy-MM-dd');
2020-07-01
3 获取年初日期
SELECT trunc('2020-09-15', 'YEAR');
2020-01-01
SELECT date_format(date_trunc('YEAR', '2020-09-15'),'yyyy-MM-dd');
2020-01-01
4 获取月初日期
SELECT trunc('2020-09-15', 'MM');
2020-09-01
SELECT date_format(date_trunc('MM', '2020-09-15'),'yyyy-MM-dd');
2020-09-01
SELECT concat(substring('2020-09-15',1,8),'01');
2020-09-01
5 获取月末日期
select last_day('2009-01-12');
2009-01-31
6 获取昨天的日期
select date_format(date_sub(current_date, 1),'yyyMMdd');