HiveSQL SparkSQL中常用知识点记录

news2024/9/28 9:33:57

目录

0. 相关文章链接

1. hive中多表full join主键重复问题

2. Hive中选出最新一个分区中新增和变化的数据

3. Hive中使用sort_array函数解决collet_list列表排序混乱问题

4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法

5. HiveSQL & SparkSQL中炸裂函数的使用(列转行)

6. HiveSQL & SparkSQL中对时间的转换


0. 相关文章链接

  开发随笔文章汇总  

1. hive中多表full join主键重复问题

hive中多表full join主键重复问题

2. Hive中选出最新一个分区中新增和变化的数据

Hive中选出最新一个分区中新增和变化的数据

3. Hive中使用sort_array函数解决collet_list列表排序混乱问题

Hive中使用sort_array函数解决collet_list列表排序混乱问题

4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法

        我们在SQL中,会碰到使用collect_list和concat_ws将该列的数值统计成一个字段的情况,这时候我们会发现当小数位数太多的时候,有些转换成文本的时候,就会使用科学计数了。如下SQL和图片所示:

select 
    concat_ws('_', collect_list(num))
from (
    SELECT cast(0.000001 as double) as num
    union all
    SELECT cast(0.000009 as double) as num
)
;

        这时如果在应用上需要这个数值进行统计的话,会发现数据错误,所以我们此时,就需要使用特定的方法,将统计出来的文本数据也展示成正常的数据显示(这样在应用上进行切分并获取对应的数据时就能获取到正确的数据);获取方式如下SQL和图片所示:

select 
    concat_ws('_', collect_list(cast(num as DECIMAL(20, 6))))
from (
    SELECT cast(0.000001 as double) as num
    union all
    SELECT cast(0.000009 as double) as num
)
;

核心点:使用cast和decimal保存对应的固有位数,但是要注意decimal中当位数不足时会在后面补0,所以需要注意数值需要的保留位数和固有位数。

5. HiveSQL & SparkSQL中炸裂函数的使用(列转行)

原始数据如下:

select 
    user_id
    ,supply_suppress_score
    ,dt 
FROM yishou_data.dwt_user_preference_score_180day_sp_dt 
where dt = 20230714 and user_id = '25887';

炸裂的语法和展示的数据如下(会新增一列:temp_field):

SELECT
    user_id
    , supply_suppress_score
    , dt
    , temp_field
FROM yishou_data.dwt_user_preference_score_180day_sp_dt
lateral view outer explode (split(supply_suppress_score, ',')) as temp_field
where dt = 20230714 and user_id = '25887'
;

6. HiveSQL & SparkSQL中对时间的转换

  • 函数一:日期时间转日期函数【 to_date() 】
-- to_date(string timestamp) 返回日期时间字段中的日期部分
-- 返回类型:string
-- 其中的cast(xxx as TIMESTAMP)是将对应的秒值转换成TIMESTAMP的毫秒值,会乘以1000

select to_date('2023-06-26 10:03:01') 
-- 输出结果:2023-06-26

select to_date(CAST(1687708800 as TIMESTAMP))
-- 输出结果:2023-06-26
  • 函数二:获取当前日期和时间
-- current_date() 返回当前时间日期
-- 返回类型:date
select current_date()
-- 2023-07-24

-- 通过unix_timestamp和from_unixtime 可以获取当前的时间
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss')
-- 2023-07-24 16:46:08
  • 函数三:查询当前系统时间(毫秒数 和 秒数) 
-- current_timestamp() 返回当前时间戳
-- 返回类型:timestamp
select current_timestamp() 
-- 1690170111525

-- 时间戳【秒数】
select unix_timestamp()
-- 1690188440
  • 函数四:日期增加函数 【 date_add() 】
-- date_add(string startdate, int days) 返回开始日期startdate增加days天后的日期
-- 返回类型:string

select date_add('2023-07-24', 1)
-- 2023-07-25

select date_add('2023-07-24', -1)
-- 2023-07-23
  • 函数五:日期减少函数:date_sub()
-- date_sub (string startdate, int days) 返回开始日期startdate减少days天后的日期
-- 返回类型:string

select date_sub('2023-07-24', 1) 
-- 2023-07-23

select date_sub('2023-07-24', -1) 
-- 2023-07-25
  • 函数六:日期比较函数:datediff()
-- datediff(string enddate, string startdate) 返回结束日期减去开始日期的天数
-- 返回类型:int

select datediff('2023-07-23','2023-07-21')
-- 2

select datediff('2023-07-23','2023-07-25')
-- -2
  • 函数七:日期格式化,按照格式返回字符串:date_format()
-- date_format(date/timestamp/string, string fmt) 按指定格式返回date
-- 返回类型: string

select date_format('2023-07-23 10:00:00','yyyy-MM-dd') 
--2023-07-23

select date_format('2023-07-23 10:00:00','yyyyMMdd') 
--20230723

select date_format('2023-07-23 10:00:00','yyyy-MM') 
-- 2023-07

select date_format('2023-07-23 10:00:00','yyyy') 
--2023
  • 函数八:日期转换成年、月、日、小时、分钟、秒函数【如果传入字符串需要是日期对应的格式,例:yyyy-MM-dd HH:mm:ss】
-- 日期转年函数:year()
-- year(string/date) 返回时间字符串的年份部分
-- 返回类型:int
select year('2023-07-23 10:00:00') 
-- 2023

-- 日期转月份函数:month()
-- month(string/date) 返回时间字符串的月份
-- 返回类型:int
select month('2023-07-23 10:00:00') 
--7

-- 日期转天函数:day() /dayofmonth(date)
-- day(string/date) 返回时间字符串的天
-- 返回类型:int
select day('2023-07-23 10:00:00') 
--23
select day('2023-07-23') 
--23
select dayofmonth('2023-07-23 10:00:00') 
--23

-- 日期转小时函数:hour()
-- hour(string/date) 返回时间字符串的小时数字
-- 返回类型:int
select hour('2023-07-23 10:00:00') 
--10

-- 日期转分钟函数:minute()
-- minute(string/date) 返回时间字符串的分钟数字
-- 返回类型:int
select minute('2023-07-23 10:00:00') 
--0

-- 日期转秒函数:second()
-- second(string/date) 返回时间字符串的分钟数字
-- 返回类型:int
select second('2023-07-23 10:00:00') 
--0
  • 函数九:月份差:months_between()
-- months_between(date1, date2) 返回date1与date2之间相差的月份,如date1>date2,则返回正,否则为负
-- 返回类型:double

select months_between('2023-07-23','2023-08-25') 
--  -1.06451613

select months_between('2023-07-23','2023-06-25') 
--  0.93548387

select months_between('2023-07-23','2023-07-23') 
--0
  • 函数十:增加月份:add_months()
-- add_months(string start_date, int num_months) 返回当前时间下再增加num_months个月的日期
-- 返回类型:string

select add_months('2023-07-23',2) 
-- 2023-09-23

select add_months('2023-07-23',-2) 
-- 2023-05-23
  • 函数十一:查询时间字符串位于一年中的第几个周内:weekofyear()
-- weekofyear(string/date) 返回时间字符串位于一年中的第几个周内
-- 返回类型:int

select weekofyear('2023-07-23 12:00:00') 
-- 29
  • 函数十二:返回月末: last_day()
-- last_day(string date) 返回这个月的最后一天的日期,忽略时分秒部分(HH:mm:ss)
-- 返回类型:string

select last_day(current_date()) 
-- 2023-07-31

select last_day('2023-07-23') 
-- 2023-07-31

select last_day('2023-07-23 12:00:00') 
-- 2023-07-31
  • 函数十三:返回时间的最开始年份或月份 :trunc()
-- trunc(string date, string format) 返回时间的最开始年份或月份
-- 返回类型:string

select trunc(current_date(),'YY') 
-- 2023-01-01

select trunc('2023-07-23','YY') 
-- 2023-01-01

select trunc(current_date(),'MM') 
-- 2023-07-01

select trunc('2023-07-23','MM') 
-- 2023-07-01
  • 函数十四:返回当月第1天
-- 方案一:使用trunc方法获取最开始的月份
select trunc(current_timestamp(),'MM')
-- 2023-07-01

--方案二:先使用dayofmonth获取当前时间在当月的天数,然后再使用date_sub使用当前日期减去当月天数减一
select date_sub(current_date,dayofmonth(current_date)-1)
-- 2023-07-01
  • 函数十五:返回下个月/上个月第1天
-- 先使用add_months函数加/减一个月,再通过trunc获取这个月的第一天
select trunc(add_months(current_timestamp(),1),'MM')
  • 函数十六:返回下个月/上个月最后1天
-- 先使用add_months函数加/减一个月,再通过trunc获取这个月的第一天,作为第一个参数
-- 先使用add_months函数加/减一个月,再通过last_day获取这个月的最后一天,最后通过dayofmonth获取到这个月有多少天,作为第二个参数
-- 使用date_add函数,将上述第一个参数正常填入,第二个参数减一填入
select date_add(
    trunc(add_months(current_timestamp(),1),'MM') , 
    dayofmonth(last_day(add_months(current_timestamp(),1))) - 1
);
-- 2023-08-31
  • 函数十七:下周几的具体日期: next_day()
-- next_day(string date, string week) 返回当前时间的下一个星期X所对应的日期
-- 返回类型:string
-- 注意:通过next_day和date_sub,还可以用来求取本周几

-- 下周一
select next_day(to_date(CURRENT_TIMESTAMP),'MO') 
-- 2023-07-31

select next_day(CURRENT_DATE,'MO') 
-- 2023-07-31
  • 函数十八:UNIX时间戳转日期函数:from_unixtime()
-- from_unixtime(bigint unixtime[, string format]) 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式
-- 返回类型:string

select from_unixtime(1323308143,'yyyy-MM-dd') 
--2011-12-08
  • 函数十九:日期转UNIX时间戳函数: unix_timestamp()
-- unix_timestamp(string date) 转换格式为“yyyy-MM-dd HH:mm:ss“的日期到UNIX时间戳。如果转化失败,则返回0
-- 返回类型: bigint

select unix_timestamp('2019-03-07 13:01:03') 
--1551934863

-- unix_timestamp(string date, string pattern) 转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0
-- 返回类型: bigint

select unix_timestamp('2009-03-20', 'yyyy-MM-dd') 
--1553011200

未完待续......


注:其他相关文章链接由此进 ->  开发随笔文章汇总 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/808846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 面试题 01.03. URL化

⭐️ 题目描述 🌟 leetcode链接:面试题 01.03. URL化 思路: 计算出空格的个数,我们可以知道最后一个字符的位置 endPos,再从后 end 向前遍历若不是空格正常拷贝,是空格则替换成 %20,最终当空格…

Linux系统编程之进程控制(上)

一、进程标识 1.pid 每个进程都有非负整数表示的唯一进程ID,即pid,其类型为pid_t类型。可用ps命令查看当前所有进程的信息,该命令可以加选项,一般使用ps -ef或ps axf(打印进程树),查看当前系统所有进程的信息。需要注…

【Rust教程 | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一,Rust简介1,Rust的历史2,Rust的特性3,为什么选择Rust 二, Rust环境配置1,windows11安装2,Linux安装 三,安装IDE 前言 Rust是一种系统编程语言,专注于速度…

【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1

文章目录 前言安装小试牛刀用repVgg抽取向量构建Faiss索引进行相似性搜索项目延伸总结 前言 Faiss的全称是Facebook AI Similarity Search。 这是一个开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法。 暴力检索耗时巨大,对于…

Flowable-任务-用户任务

定义 顾名思义,用户任务是需要人工参与处理的。当流程执行到用户任务节点时,流程引擎会给指指定的用户(办理人或候选人)或一组用户(候选组)创建待处理的任务项,等待用户的处理。 用户任务的参与…

HTML一些基础知识

1、Web标准:主要包含结构、表现、行为。结构用于对网页元素进行整理和分类,主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式,主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写,主要是js文件。 Html相当…

AddForce

ForceMode: Force:关注的是力整体 Impulse:关注的是冲量,与质量相关 VelocityChange:关注的是速度,与质量无关 Acceleration:关注的是加速度,与质量无关 public void AddForce…

前后端分离实现博客系统

文章目录 博客系统前言1. 前端1.1 登陆页面1.2 博客列表页面1.3 博客详情页面1.4 博客编辑页面 2. 后端2.1 项目部署2.1.1 创建maven项目2.1.2 引入依赖2.1.3 创建目录结构2.1.4 部署程序 2.2 逻辑设计2.2.1 数据库设计2.2.2 实体类设计2.2.3 Dao层设计2.2.3.1 BlogDao 2.2.4 D…

Intel RealSense D455(D400系列) Linux-ROS 安装配置(亲测可用)

硬件:Intel RealSense D455 系统:Ubuntu 18.04 Part_1: 安装librealsense SDK2.0 1.1 注册密钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE或者 sudo apt-key adv --keyserver hkp:/…

Mysql定时删除表数据

由于用户环境有张日志表每天程序都在狂插数据,导致不到一个月时间,这张日志表就高达200多万条记录,但是日志刷新较快,里面很多日志没什么作用,就写了个定时器,定期删除这张表的数据。 首先查看mysql是否开启…

【Linux】进程间通信——system V共享内存 | 消息队列 | 信号量

文章目录 一、system V共享内存1. 共享内存的原理2. 共享内存相关函数3. 共享内存实现通信4. 共享内存的特点 二、system V消息队列(了解)三、system V信号量(信号量) 一、system V共享内存 1. 共享内存的原理 共享内存是一种在…

自动化测试Junit(测试系列8)

目录 前言: 1.什么是Junit 2.Junit相关的技术 2.1注解 2.1.1Test 2.1.2Disable 2.1.3BeforeAll和AfterAll 2.1.4BeforeEach和AfterEach 2.2参数化 2.2.1单参数 2.2.2多参数 2.2.2.1CSV获取参数 2.2.2.2方法获取参数 2.3测试套件 2.3.1通过class运行测…

Java工程师研学之路【002Java基础语法上】

知识体系(Knowledge system) 练习(practice) 要求:从控制台输入两个数字,然后输出两个数字的求和结果。 import java.util.Scanner; public class HelloJava {public static void sum(){System.out.print…

kafka集群搭建(Linux环境)

zookeeper搭建,可以搭建集群,也可以单机(本地学习,没必要搭建zookeeper集群,单机完全够用了,主要学习的是kafka) 1. 首先官网下载zookeeper:Apache ZooKeeper 2. 下载好之后上传到…

以数据要素为支点,兴业银行撬动企业“技术杠杆”

文 | 螳螂观察 作者 | 李永华 推荐理财产品,恰好符合客户能承受的风险水平和想要的收益率水平,在资金投入上也契合客户当下的财务安排,于是顺利成交; 为客户办理的信用卡,优惠的场景方向与客户常常消费的领域大体一…

RWEQ模型教程

详情点击链接:基于“RWEQ”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写 前沿 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一,土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的…

U盘安装CentOS7.9出错:进入 dracut问题和解决方法

U盘安装CentOS7.9出错:进入 dracut问题和解决方法 原因:U盘名称未识别, 解决:进入启动界面,按e进入编辑界面 修改: vmlinuz initrdinitrd.img inst.stage2hd:LABELCentOS\x207\x20x86_64.check quiet 为 …

前端框架学习-Vue(二)

最近在学习Vue框架,Vue中的内容很多。相当于把之前后端的MVC,V层转移到前端来编写和部署。下面是学习Vue时的大纲。 Vue生命周期是Vue应用的生命周期Vue脚手架,即vue-cli,使用node.js 来创建和启动vue项目Vue组件知识,…

java重试机制实现方案

本文内容是目前团队内小磊同学对重试机制实现方案的梳理总结。 从为什么需要重试的背景开始,到重试的场景,大致的一些设计思路,最后通过两个成熟的retry组件进行案例讲解,理论实战。 背景 重试是系统提高容错能力的一种手段。在一…

Windows下Nginx安装与配置教程

一、前言 1、Nginx是什么? Nginx是一个开源的Web服务器,同时Nginx也提供了反向代理和负载均衡的功能。 Nginx通常作为负载均衡器暴露在外网接受用户请求,同时也使用其反向代理的功能,将用户的请求转发到实际提供服务的内网服务器…