HiveSQL SparkSQL中常用知识点记录
目录
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 numunion allSELECT 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 numunion allSELECT 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):
SELECTuser_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的毫秒值,会乘以1000select to_date('2023-06-26 10:03:01')
-- 输出结果:2023-06-26select 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天后的日期
-- 返回类型:stringselect date_add('2023-07-24', 1)
-- 2023-07-25select date_add('2023-07-24', -1)
-- 2023-07-23
- 函数五:日期减少函数:date_sub()
-- date_sub (string startdate, int days) 返回开始日期startdate减少days天后的日期
-- 返回类型:stringselect date_sub('2023-07-24', 1)
-- 2023-07-23select date_sub('2023-07-24', -1)
-- 2023-07-25
- 函数六:日期比较函数:datediff()
-- datediff(string enddate, string startdate) 返回结束日期减去开始日期的天数
-- 返回类型:intselect datediff('2023-07-23','2023-07-21')
-- 2select datediff('2023-07-23','2023-07-25')
-- -2
- 函数七:日期格式化,按照格式返回字符串:date_format()
-- date_format(date/timestamp/string, string fmt) 按指定格式返回date
-- 返回类型: stringselect date_format('2023-07-23 10:00:00','yyyy-MM-dd')
--2023-07-23select date_format('2023-07-23 10:00:00','yyyyMMdd')
--20230723select date_format('2023-07-23 10:00:00','yyyy-MM')
-- 2023-07select 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,则返回正,否则为负
-- 返回类型:doubleselect months_between('2023-07-23','2023-08-25')
-- -1.06451613select months_between('2023-07-23','2023-06-25')
-- 0.93548387select months_between('2023-07-23','2023-07-23')
--0
- 函数十:增加月份:add_months()
-- add_months(string start_date, int num_months) 返回当前时间下再增加num_months个月的日期
-- 返回类型:stringselect add_months('2023-07-23',2)
-- 2023-09-23select add_months('2023-07-23',-2)
-- 2023-05-23
- 函数十一:查询时间字符串位于一年中的第几个周内:weekofyear()
-- weekofyear(string/date) 返回时间字符串位于一年中的第几个周内
-- 返回类型:intselect weekofyear('2023-07-23 12:00:00')
-- 29
- 函数十二:返回月末: last_day()
-- last_day(string date) 返回这个月的最后一天的日期,忽略时分秒部分(HH:mm:ss)
-- 返回类型:stringselect last_day(current_date())
-- 2023-07-31select last_day('2023-07-23')
-- 2023-07-31select last_day('2023-07-23 12:00:00')
-- 2023-07-31
- 函数十三:返回时间的最开始年份或月份 :trunc()
-- trunc(string date, string format) 返回时间的最开始年份或月份
-- 返回类型:stringselect trunc(current_date(),'YY')
-- 2023-01-01select trunc('2023-07-23','YY')
-- 2023-01-01select trunc(current_date(),'MM')
-- 2023-07-01select 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-31select 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到指定时间的秒数)到当前时区的时间格式
-- 返回类型:stringselect from_unixtime(1323308143,'yyyy-MM-dd')
--2011-12-08
- 函数十九:日期转UNIX时间戳函数: unix_timestamp()
-- unix_timestamp(string date) 转换格式为“yyyy-MM-dd HH:mm:ss“的日期到UNIX时间戳。如果转化失败,则返回0
-- 返回类型: bigintselect unix_timestamp('2019-03-07 13:01:03')
--1551934863-- unix_timestamp(string date, string pattern) 转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0
-- 返回类型: bigintselect unix_timestamp('2009-03-20', 'yyyy-MM-dd')
--1553011200
未完待续......
注:其他相关文章链接由此进 -> 开发随笔文章汇总
相关文章:

HiveSQL SparkSQL中常用知识点记录
目录 0. 相关文章链接 1. hive中多表full join主键重复问题 2. Hive中选出最新一个分区中新增和变化的数据 3. Hive中使用sort_array函数解决collet_list列表排序混乱问题 4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法 5. HiveSQL & SparkSQL中炸裂…...

mac不识别移动硬盘导致无法拷贝资源
背景 硬盘插入到Mac电脑上之后,mac不识别移动硬盘导致无法拷贝资源。 移动硬盘在Mac上无法被识别的原因可能有很多,多数情况下,是硬盘的格式与Mac电脑不兼容。 文件系统格式不兼容 macOS使用的文件系统是HFS或APFS,如果移动硬盘是…...

Opencv的Mat内容学习
来源:Opencv的Mat内容小记 - 知乎 (zhihu.com) 1.Mat是一种图像容器,是二维向量。 灰度图的Mat一般存放<uchar>类型 RGB彩色图像一般存放<Vec3b>类型。 (1)单通道灰度图数据存放样式: (2)RGB三通道彩色图存放形式不同&#x…...

MySQL~数据库的设计
二、数据库的设计 1、多表之间的关系 1.1 三种分类 一对一: 分析:一个人只有一个身份证,一个身份证只能对应一个人 如:人和身份证 一对多: 如:部门和员工 分析:一个部门有多个员工ÿ…...

开源了!最强原创图解八股文面试网来袭
强烈推荐 Github上业内新晋的一匹黑马—Java图解八股文面试网—Java2Top.cn,图解 Java 大厂面试题,深入全面,真的强烈推荐~ 这是一个二本逆袭阿里的大佬根据自己秋招上岸所看过的相关专栏,面经,课程,结合自…...

微信小程序开发6
一、分包-基础概念 1.1、什么是分包 分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。 1.2、分包的好处 对小程序进行分包的好处主要有以下两点: 可以优化小程序…...

JS 根据身份证号获取年龄、性别、出生日期
先说一代身份证和二代身份证的区别: 1.编号位数不同,第一代身份证为15位号码,第二代证是18位号码 2.编码规则不同,第一代身份证在前6位号码后没有完整出生年份,而二代的有完整的出生年份,一代身份证将年份前二位省略…...

Python+Mongo+LSTM(GTP生成)
下面是一个简单的示例来展示如何使用Python和MongoDB来生成LSTM预测算法。 首先,我们需要安装pymongo和tensorflow库,可以使用以下命令进行安装: pip install pymongo tensorflow接下来,我们连接到MongoDB数据库并获取需要进行预…...

关于idea如何成功运行web项目
导入项目 如图 依次选择 file - new - Project from Existing Sources 选择存放的项目目录地址 如图 导入完成 点击ok 如图 依次选择 Create project from existing sources 点击next如图 ,此处默认即可 点击 next如图 点击next有该提示 是因为之前导入过…...

python读取json文件
import json# 文件路径(同目录文件名即可,不同目录需要绝对路径) path 1.json# 读取JSON文件 with open(path, r, encodingutf-8) as file:data json.load(file)#data为字典 print(data) print(type(data))...

迁移学习、微调、计算机视觉理论(第十一次组会ppt)
@TOC 数据增广 迁移学习 微调 目标检测和边界框 区域卷积神经网络R—CNN...

特殊矩阵的压缩存储
1 数组的存储结构 1.1 一维数组 各数组元素大小相同,且物理上连续存放。第i个元素的地址位置是:a[i] LOC i*sizeof(ElemType) (LOC为起始地址) 1.2 二维数组 对于多维数组有行优先、列优先的存储方法 行优先:先行后列,先存储…...

【网络原理】 (1) (应用层 传输层 UDP协议 TCP协议 TCP协议段格式 TCP内部工作机制 确认应答 超时重传 连接管理)
文章目录 应用层传输层UDP协议TCP协议TCP协议段格式TCP内部工作机制确认应答超时重传 网络原理部分我们主要学习TCP/IP协议栈这里的关键协议(TCP 和 IP),按照四层分别介绍.(物理层,我们不涉及). 应用层 我们需要学会自定义一个应用层协议. 自定义协议的原因? 当前的软件(应用…...

【SQL语句】
目录 一、SQL语句类型 1.DDL 2.DML 3.DLL 4.DQL 二、数据库操作 1.查看 2.创建 2.1 默认字符集 2.2 指定字符集 3.进入 4.删除 5.更改 5.1 库名称 5.2 字符集 三、数据表操作 1.数据类型 1.1 数值类型(常见,下同) 1.1.1 T…...

自动驾驶和机器人学习和总结专栏汇总
汇总如下: 一. 器件选型心得(系统设计)--1_goldqiu的博客-CSDN博客 一. 器件选型心得(系统设计)--2_goldqiu的博客-CSDN博客 二. 多传感器时间同步方案(时序闭环)--1 三. 多传感器标定方案&…...

【C++初阶】C++基础(下)——引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr
目录 1. 引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.5 传值、传引用效率比较 1.6 引用和指针的区别 2. 内联函数 2.1 概念 2.2 特性 3.auto关键字(C11) 3.1 类型别名思考 3.2 auto简介 3.3 auto的使用细则 3.4 auto不能推…...

OSI 7层模型 TCPIP四层模型
》Ref: 1. 这个写的嘎嘎好,解释了为啥4层7层5层,还有数据包封装的问题:数据包在网络中的传输过程详解_数据包传输_张孟浩_jay的博客-CSDN博客 2. HTTP协议 与 TCP协议 的区别,作为web程序员必须要懂 - 知乎 (zhihu.com) 3. 数据…...

iOS-持久化
目的 1.快速展示,提升体验 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户 2.节省用户流量(节省服务器资源) 对于较大的资源数据进行缓存…...

PC音频框架学习
1.整体链路 下行播放: App下发音源→CPU Audio Engine 信号处理→DSP数字信号处理→Codec DAC→PA→SPK 上行录音: MIC拾音→集成运放→Codec ADC→DSP数字信号处理→CPU Audio Engine 信号处理→App 2.硬件 CPU PCH DSP(可选) Codec PA SPKbox MIC…...

机器学习:提取问题答案
模型BERT 任务:提取问题和答案 问题的起始位置和结束位置。 数据集 数据集 DRCDODSQA 先分词,然后tokenize 文章长度是不同的,bert的token的长度有限制,一般是512, self-attention的计算量是 O ( n 2 ) O(n^2) O(n…...

【Ansible】
目录 一、Ansible简介二、ansible 环境安装部署1、管理端安装 ansible 三、ansible 命令行模块(重点)1.command 模块2.shell 模块3、cron 模块4.user 模块5.group 模块6.copy 模块(重…...

分布式版本控制系统git详解
git 是目前世界上最先进的分布式版本控制系统 补充说明 git命令 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。 Linus虽然创建了Linux,但Linux的壮大是靠…...

如何使用Python进行数据挖掘?
使用Python进行数据挖掘需要掌握以下几个关键步骤: 数据收集:首先,你需要获取你要进行数据挖掘的数据。可以从公共数据集、API、数据库等各种来源收集数据。 数据清洗:清洗数据是一个重要的步骤,它包括去除重复数据、…...

若依-前台无法正常启动,npm run dev失败
问题场景: 使用若依Vue前端分离版-基于SpringBoot的权限管理系统进行实战。 问题描述与解决 拉取若依项目后,根据官方开发文档(项目readme文档)进行依赖下载安装后,启动失败。 出现以下几个问题: 运行n…...

Spring之IoC源码分析及设计思想(一)——BeanFactory
关于Spring的IOC Spring 是一个开源的 Java 平台,它提供了一种简化应用程序开发的框架。它是一个分层的框架,包括两个主要的内核:控制反转(IOC)和面向切面编程(AOP)。IOC 允许应用程序将组件之…...

⛳ 面向对象面试题
面向对象面试题目录 ⛳ 面向对象面试题🚜 一,成员变量,局部变量,类变量存储在内存的什么地方?🐾 1.1,类变量(静态成员变量)📝 1.2,成员变量⭐ 1.3…...

Java中使用Gson操作json数据
Java中使用Gson操作json数据 引入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.9.0</version></dependency>Gson工具类 package cn.test.util;import com.google.gso…...

Verilog语法学习——LV10_使用函数实现数据大小端转换
LV10_使用函数实现数据大小端转换 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 在数字芯片设计中,经常把实现特定功能的模块编写成函数&…...

Leetcode-每日一题【剑指 Offer II 009. 乘积小于 K 的子数组】
题目 给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100输出: 8解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2]…...

html/javascript-表格的创建和使用
html中表格的创建和使用 一 摘要二 使用html table标签创建表格(在html文件中)三 使用javascript创建表格(在js文件中)四 表格属性的设置:4.1. 右边框的设置:4.2. 只给表格单元格加右边框4.3. 动态设置右边…...