// 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 函数分为以下几组。在使用以下任何示