首页 > 其他分享 >Hive12---日期时间函数的操作

Hive12---日期时间函数的操作

时间:2023-07-29 17:04:55浏览次数:56  
标签:00 函数 timestamp sql --- 2023 Hive12 spark diff


Intro

    时间函数的一些操作,记录之。备查

当前时间

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.types import DoubleType, IntegerType, StringType
def get_or_create(app_name):
    spark = (
        SparkSession.builder.appName(app_name)
        .config("spark.driver.maxResultSize", "10g")
        .config("spark.sql.execution.arrow.enabled", "true")
        .config("spark.dynamicAllocation.enabled", "false")
        .config("spark.sql.crossJoin.enabled", "true")
        .config("spark.kryoserializer.buffer.max", "512m")
        .getOrCreate()
    )
    spark.sparkContext.setLogLevel("ERROR")
    return spark
spark = get_or_create("spark")

时间戳-秒级

spark.sql("select unix_timestamp() as now_timestamp ").show()
+-------------+
|now_timestamp|
+-------------+
|   1690342345|
+-------------+

日期

sql = """
select from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss") as date_time,
from_unixtime(unix_timestamp(),"yyyyMMdd") as ds,
current_timestamp() as t,--取得当前日期时间,粒度到毫秒级
current_date() as t1 --当前日期
"""
spark.sql(sql).show(truncate=False)
+-------------------+--------+-----------------------+----------+
|date_time          |ds      |t                      |t1        |
+-------------------+--------+-----------------------+----------+
|2022-08-05 19:01:32|20220805|2022-08-05 19:01:32.239|2022-08-05|
+-------------------+--------+-----------------------+----------+

日期转时间戳

spark.sql("select to_unix_timestamp('20170101','yyyyMMdd') as timestamp,from_unixtime(to_unix_timestamp('20170101','yyyyMMdd'),'yyyy-MM-dd HH:mm:ss') as date_time").show(truncate=False)
+----------+-------------------+
|timestamp |date_time          |
+----------+-------------------+
|1483200000|2017-01-01 00:00:00|
+----------+-------------------+

当月首日

spark.sql("SELECT trunc(substring('2022-03-18 00:00:00',1,10),'MM') as month_first_day").show(truncate=False)
+---------------+
|month_first_day|
+---------------+
|2022-03-01     |
+---------------+

月份差

spark.sql("SELECT to_unix_timestamp('2023-07-26 12:00:00')-to_unix_timestamp('2023-07-21 23:01:00') as diff_seconds").show(truncate=False)
+------------+
|diff_seconds|
+------------+
|392340      |
+------------+
392340/60/60/24/31
0.14648297491039425
spark.sql("SELECT MONTHS_BETWEEN('2023-07-26 12:00:00','2023-07-21 23:01:00') as diff_months").show(truncate=False)
+-----------+
|diff_months|
+-----------+
|0.14648297 |
+-----------+
spark.sql("SELECT to_unix_timestamp('2023-06-26 00:00:00')-to_unix_timestamp('2023-06-21 00:00:00') as diff_seconds").show(truncate=False)
+------------+
|diff_seconds|
+------------+
|432000      |
+------------+
spark.sql("SELECT MONTHS_BETWEEN('2023-06-26','2023-06-21') as diff_months").show(truncate=False)
+-----------+
|diff_months|
+-----------+
|0.16129032 |
+-----------+
432000/60/60/24/31
0.16129032258064516

这里的月份差背后的计算逻辑,应该是计算两个日期的秒差,转换成天再除31天
如果只想计算自然月差,可以先转成当月首日,再求解

spark.sql("SELECT to_unix_timestamp('2023-07-01 00:00:00')-to_unix_timestamp('2023-06-01 00:00:00') as diff_seconds").show(truncate=False)
+------------+
|diff_seconds|
+------------+
|2592000     |
+------------+
2592000/60/60/24/31
0.967741935483871

当月首日做月份差,好像走其他逻辑,分母不固定了~不细究了

spark.sql("SELECT MONTHS_BETWEEN('2023-08-01','2023-06-01') as diff_months").show(truncate=False)
+-----------+
|diff_months|
+-----------+
|2.0        |
+-----------+
spark.sql("SELECT MONTHS_BETWEEN(trunc('2023-08-01','MM'),trunc('2023-07-31','MM')) as diff_months").show(truncate=False)
+-----------+
|diff_months|
+-----------+
|1.0        |
+-----------+

日期差

返回的是整数,天数差

spark.sql("SELECT datediff('2023-07-26','2023-07-21') as diff_days").show(truncate=False)
+---------+
|diff_days|
+---------+
|5        |
+---------+
spark.sql("SELECT datediff('2023-07-26 12:00:00','2023-07-21 23:56:00') as diff_days").show(truncate=False)
+---------+
|diff_days|
+---------+
|5        |
+---------+

日期加减

spark.sql("SELECT date_add('2023-07-26 12:00:00',10) as add_days").show(truncate=False)
+----------+
|add_days  |
+----------+
|2023-08-05|
+----------+
spark.sql("SELECT date_add('2023-07-26 12:00:00',-10) as minus_days").show(truncate=False)
+----------+
|minus_days|
+----------+
|2023-07-16|
+----------+

                                2023-07-26 阴 于南京市江宁区


标签:00,函数,timestamp,sql,---,2023,Hive12,spark,diff
From: https://blog.51cto.com/u_15575753/6893731

相关文章

  • PyPackage01---Pandas17_null、inf筛选
    判断数据集是否存在null、inf,快速定位所在列、行,方便分析原因无穷大、无穷小处理importpandasaspdimportnumpyasnp#Createdataframeusingdictionarydata={'StudentID':[10,11,12,13,14],'Age':[23,22,24,22,np.nan],'Weight':[66,72,np.in......
  • electron的electron-packager打包运行和electron-builder生产安装包过程,学透 Electron
    electron的electron-packager打包运行和electron-builder生产安装包过程开发electron客户端程序,打包是绕不开的问题。macOS应用构建,看似近在咫尺,实则坑坑致命。场景:mac笔记本打包,以及生产出可交付的软件安装包,如何避坑,如何理解app的产生过程!!!!可以按照我测试的路程来配置环境。包......
  • 【CMU15-445 FALL 2022】Project #1 - Buffer Pool
    About实验官网Project#1-BufferPool在线评测网站gradescopeLabTask#1-ExtendibleHashTable详见——【CMU15-445FALL2022】Project#1-ExtendableHashing如果链接失效,请查看当前平台我之前发布的文章。Task#2-LRU-KReplacementPolicyConcept相关参考LRU-K和2Q......
  • mysql之find_in_Set函数
    1.语法#查询出在list中包含column2的所有行。此处list可以是字段或常量selectcolumn1fromtable_namewhereFIND_IN_SET(column2,list)2.与in的区别in后面只能跟常量,find_in_set()函数可以使用常量或字段。in是完全匹配,find_in_set()函数是精确匹配,字段值以英文”,”分隔。3.举......
  • 面向对象编程的 SOLID 原则 - 里氏替换原则
    里氏替换原则里氏替换原则描述的是子类应该能替换为它的基类。意思是,给定classB是classA的子类,在预期传入classA的对象的任何方法传入classB的对象,方法都不应该有异常。这是一个预期的行为,因为继承假定子类继承了父类的一切。子类可以扩展行为但不会收窄。因此,当......
  • 关于vue element-admin 切换tag, 页面刷新 以及内存增加不释放问题
    1:切换tag,页面刷新,检查了路由,配置了  nocache:false,以及isKeep:true, 但是在页面tag切换时,还是会刷新,, 在生命周期中打印,发现能够打印,, 检查了代码,在组件引用中未发现v-if的使用, 最后竟查找,借鉴 https://blog.csdn.net/weixin_45616483/article/details/122959997 ......
  • 面向对象编程的 SOLID 原则 - 依赖倒置原则
    依赖倒置原则依赖倒置原则描述的是我们的class应该依赖接口和抽象类而不是具体的类和函数。在这篇文章(2000)里,Bob大叔如下总结该原则:“如果OCP声明了OO体系结构的目标,那么DIP则声明了主要机制”。这两个原则的确息息相关,我们在讨论开闭原则之前也要用到这一模式。......
  • 面向对象编程的 SOLID 原则 - 接口隔离原则
    接口隔离原则隔离意味着保持独立,接口隔离原则是关于接口的独立。该原则描述了很多客户端特定的接口优于一个多用途接口。客户端不应该强制实现他们不需要的函数。这是一个简单的原则,很好理解和实践,直接看例子。publicinterfaceParkingLot{ voidparkCar(); //Decrease......
  • v831-c-yolov2例程解析
    没错,自从把ubuntu搞坏之后无奈把之前的例程全删了,因此所有的笔记都没了,又得从新分析一遍main函数先从最简单的main分析此函数主要创建一个屏幕句柄用来显示,然后调用nn_test来开始yolov2的操作,并且传入画布,显示等都在里面操作,最后跳出来后摧毁屏幕nn_test函数此函数很长,一点......
  • 洛谷 P9479 - [NOI2023] 桂花树
    显然,条件一等价于在\(T'\)中,\(1\simn\)组成的虚树等于它本身。条件二等价于\(1\simi\)组成的虚树上点的标号不超过\(i+k\)。我们考虑在原树的基础上依次添加\(n+1\simn+m\)这\(m\)个点。添加一个点\(i\)时,它与原树的位置关系可能有以下几种:挂在原树上某......