相关文章推荐
温暖的香烟  ·  dart list sort-掘金·  11 月前    · 
呐喊的皮蛋  ·  TRANSPARENTPROXY/REALP ...·  1 年前    · 
重感情的板凳  ·  SQL ...·  1 年前    · 
// 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');

1.1时区设置 set spark .sql.session.timeZone=GMT+8; --设置为东八区 时间 set spark .sql.session.timeZone=UTC; --设置为UTC 时间 1.2 时间 戳格式化为 日期 from_unixtime(floor(ts/1000),'yyyy-MM-dd') --注释,使用此方法 转换 时间 时,默认使用的是集群的时区(时区设置参考1.1) --次函数的 时间 戳为10位的 最近在用Py Spark 做ETL,然后发现了 Spark 存在的时区问题。 Mysql的时区默认是CST格式, 但是 Spark 默认的是GMT格式,因此直接使用 Spark 读取Mysql的 时间 时,会被转为GMT格式,对于这个问题,只需要设置 spark .sql.session.timeZone为CST就可以解决了,但由此由引发了一个新的问题。 当两者都是CST的时候,将 时间 转为yyyy-MM-dd hh:mm:ss来看时,两者是相同的,问题在于分别使用unix_timestamp转为 时间 戳的时候,两个 时间 戳之间会相差1 Spark 是一个开源的通用并行分布式计算框架,由加州大学伯克利分校的AMP实验室开发,支持内存计算、多迭代批量 处理 、即席查询、流 处理 和图计算等多种范式。 Spark 内存计算框架适合各种迭代算法和交互式数据分析,能够提升 大数据 处理 的实时性和准确性,现已逐渐获得很多企业的支持,如阿里巴巴、百度、网易、英特尔等公司。 Spark 快速数据 处理 系统讲解 Spark 的使用方法,包括如何在多种机器上安装 Spark ,如何配置一个 Spark 集群,如何在交互模式下运行第一个 Spark 作业,如何在 Spark 集群上构建一个生产级的脱机/独立作业,如何与 Spark 集群建立连接和使用 Spark Context,如何创建和保存RDD(弹性分布式数据集),如何用 Spark 分布式 处理 数据,如何设置Shark,将Hive查询集成到你的 Spark 作业 来,如何测试 Spark 作业,以及如何提升 Spark 任务的性能。 Spark SQL支持通过DataFrame的接口操作各种各样的数据源。DataFrame既能够使用传统的算子做 转换 操作,也可以通过注册成临时视图的方式通过SQL来操作。这篇文章将总结 Spark 的各种数据源,以及如何将数据落地到文件或者传统的关系型数据库 。... 原文链接:https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-a... val Facedf = Facedf1.withColumn("time_unix",unix_timestamp(col("time"),"yyyy-MM-dd HH:mm:ss")) 时间 戳格式 转换 日期 : val Facedf = Facedf1.withColumn("time_date",from_unixtime(col(" 假如一个方法很不规范,写了好几百行,你想去下一个方法,如果用鼠标往下滑,会挺崩溃的。或者有的时候,就是需要一个一个方法往下看,那么IDEA有没有这样方便的快捷键呢?是有的:按住Alt键,再按上/下方向键就行。 由于数据库 使用的 时间 为UTC 时间 , 当使用 spark sql 取出来后 时间 会转为当地的 时间 , 所以 时间 一直混乱不堪。为了与数据库的 时间 一致可以在提交 spark 任务时添加以下参数 –conf “ spark .driver.extraJavaOptions=-Duser.timezone=UTC” –conf “ spark .executor.extraJavaOptions=-Duser.time... 在 spark 获取 时间 用到java.util.{Calendar,Date} 以及java.text.SimpleDateFormat来对 时间 输出格式作规范 首先先导入包 import java.text.SimpleDateFormat import java.util.{Calendar, Date} 获取当前 时间 : def getNowTime(): String = { //实例化一个Date对象并且获取 时间 戳(毫秒级) val time = new Date().getTim. Spark SQL 提供了内置的标准 Date 和 Timestamp函数,定义在 DataFrame API ,所有函数都接受输入 日期 类型、 时间 戳类型或字符串。如果是String,是可以 转换 日期 格式,比如 或 ,分别返回date和timestamp;如果输入数据是无法 转换 日期 时间 戳的字符串,也返回 null。尽可能尝试利用标准库,因为与 Spark UDF相比,它们在编译时更安全、可以 处理 null 并且性能更好。为了便于阅读,将 Date 和 Timestamp 函数分为以下几组。在使用以下任何示