spark中日期时间处理

1 相关参考网站

1) 官网参考链接:Spark SQL, Built-in Functions

2 获取某个指定日期n天之内的数据

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()

3 日期格式转换

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

4 时间函数与时区关系

一 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;

5 获取特定日期

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');


你可能感兴趣的:(spark,大数据)