Hive SQL

news/2024/9/14 1:35:27/ 标签: hive, sql

一、基本数据类型

tinyint         1byte 有符号整数
smallint         2byte 有符号整数
int         4byte 有符号整数
bigint         8byte 有符号整数
boolean         布尔类型,true或者false
float         单精度浮点数
double         双精度浮点数
decimal         十进制精准数字类型 decimal(16,2)
varchar         字符序列,需指定最大长度,最大长度的范围是[1,65535] varchar(32)
string         字符串,无需指定最大长度
timestamp         时间类型
binary         二进制数据
array         数组是一组相同类型的值的集合 array arr[0]
map         map是一组相同类型的键-值对集合 map<string, int> map[‘key’]
struct         结构体由多个属性组成,每个属性都有自己的属性名和数据类型 struct<id:int, name:string> struct.id

二、基本查询

Home - Apache Hive - Apache Software Foundation

1、语法: 

sql">SELECT [ALL | DISTINCT] select_expr, select_expr, …
FROM table_reference – 从什么表查
[WHERE where_condition] – 过滤
[GROUP BY col_list] – 分组查询
[HAVING col_list] – 分组后过滤
[ORDER BY col_list] – 排序 -- 全局排序
[CLUSTER BY col_list   -- 分区排序(当 distribute by 和 sort by 字段相同时,可以使用 cluster by方式。)
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number] – 限制输出的行数

2、join连接

左右关联:inner、outer均可省略

内连接(join或inner join):只有2个表中连接字段都匹配的数据才会被保留。

左外连接(left join或left outer join):保留左表记录,右边不符合条件的用null填充

右外连接(right join或right outer join)

满外连接(full join或full outer join):保留两边全部,任一表没有符合条件的用null填充

左半连接(left semi join):内连接后,仅返回左表剩余的数据

交叉连接(笛卡尔积cross join):所有表中的所有行互相连接。

3、union和union all上下拼接:

union和union all在上下拼接sql结果时有两个要求:
(1)两个sql的结果,列的个数必须相同
(2)两个sql的结果,上下所对应列的类型必须一致

union去重并对结果排序,union all不去重

4、排序

(1)全局排序(Order By)
全局排序,只有一个Reduce。asc(ascend):升序(默认)desc(descend):降序
通常和limit一起使用,可以让每个map只需要处理limit的个数数据
(2)每个Reduce内部排序(Sort By)
Sort by为每个reduce产生一个排序文件。每个Reduce内部进行排序,对全局结果集来说不是排序。
(3)分区(Distribute By)
distribute by类似MapReduce中partition(自定义分区),进行分区,结合sort by使用。
分区排序(Cluster By)
(4)当distribute by和sort by字段相同时,可以使用cluster by方式。cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序。

三、常用函数

1、单行函数

输入一行,输出一行

  1. round:四舍五入

  2. ceil:向上取整

  3. floor:向下取整

  4. if(condition, trueValue, falseValue)

  5. case when:case when a then b [when c then d]* [else e] end :条件判断函数;如果a为true,则返回b;如果c为true,则返回d;否则返回 e ;针对同一个字段的等值判断可以把字段提在case后面

  6. cast(stuId AS INT) :类型转换

  7. nvl(A,B) :替换null值 ;A的值不为null,则返回A,否则返回B

  8. substring:截取字符串substring(string A, int start, int len)

  9. replace :替换 ;replace(string A, string B, string C) 字符串A中的子字符串B替换为C。

  10. regexp_replace:正则替换 ;regexp_replace(string A, string B, string C) 将字符串A中的符合java正则表达式B的部分替换为C。

  11. regexp:正则匹配;select ‘dfsaaaa’ regexp ‘dfsa+’,正则匹配成功,输出true

  12. repeat:重复字符串;repeat(string A, int n),字符串A重复n遍

  13. split(string str, string pat) :将一个字符串根据指定的分隔符进行分割,并返回一个数组。eg:split(arr,','),split(arr,'\\')[0]。当逗号作为分隔符时,保持不变,其他多数时候要加转义,如split(properties,'\_')

  14. concat(string A, string B, string C, ……) 将A,B,C……等字符拼接为一个字符串

  15. concat_ws(分隔符, string…| array(string)): 指定分隔符拼接字符串或者字符串数

  16. get_json_object(string json_string, string path) 解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。select get_json_object(‘[{“name”:“大海海”,“sex”:“男”,“age”:“25”},{“name”:“小宋宋”,“sex”:“男”,“age”:“47”}]’,‘$.[0].name’);

  17. unix_timestamp:返回当前或指定时间的时间戳;例如:
    select unix_timestamp(‘2022/08/08 08-08-08’,‘yyyy/MM/dd HH-mm-ss’);
    from_unixtime(bigint unixtime[, string format]) 转化UNIX时间戳到当前时区的时间格式

  18. select current_date:-- 获取当前日期,格式:2022-09-13

  19. date_format(date,格式) -- 如:date_format('2022-09-13 12:00:00', 'yyyy-MM-dd')

  20. current_timestamp:-- 获取当前时间戳。 2022-09-13 17:52:57.613

  21. fom_unixtime(bigint unixtime[, string format]); -- 把UNIX 时间戳(从1970-01-01 00:00:00 UTC 到指定时间的秒数)转为时间或者指定格式日期。

  22. unix_timestamp(time)  -- 把yyyy-MM-dd HH:mm:ss转为unix时间戳

  23. to_date(time) -- 转为日期格式,默认为yyyy-MM-dd格式。

  24. datediff:两个日期相差的天数(结束日期减去开始日期的天数)

  25. date_add(string startdate, int days) :日期加天数

  26. date_sub (string startdate, int days) 日期减天数

  27. year(date) -- 获取年份

  28. month(date) -- 获取月份

  29. day(date) -- 获取日

  30. hour(date) -- 获取小时

  31. minute(date)  -- 获取分钟

  32. second(date) -- 获取秒

  33. last_day(date) -- 指定日期所在月份的最后一天

  34. weekofyear(date)  --返回日期在该年的周数

  35. -- 判断周几

    select

    case when dayofweek('${etl_date}') =1 then '星期日'

         when dayofweek('${etl_date}') =7 then '星期六'

         when dayofweek('${etl_date}') =6 then '星期五'

         when dayofweek('${etl_date}') =5 then '星期四'

         when dayofweek('${etl_date}') =4 then '星期三'

         when dayofweek('${etl_date}') =3 then '星期二'

         when dayofweek('${etl_date}') =2 then '星期一'

         else null

         end as weekday

  36. map (key1, value1, key2, value2, …) 根据输入的key和value对构建map类型

  37. map_keys: 返回map中的key;map_values: 返回map中的value;
    select map_keys(map(‘xiaohai’,1,‘dahai’,2));

  38. array(val1, val2, …) 根据输入的参数构建数组array类

  39. array_contains: 判断array中是否包含某个元素 ;select array_contains(array(‘a’,‘b’,‘c’,‘d’),‘a’);

  40. sort_array:将array中的元素排序

  41. struct(val1, val2, val3, …) 根据输入的参数构建结构体struct类

2、高级聚合函数

多进一出 (多行传入,一个行输出)。

  1. 普通聚合 count/sum.
  2. collect_set():多行数据收集为一行,返回set集合,无序不重复

  3. collect_list():多行数据收集为一行,返回list集合,有序重复

3、炸裂函数UDTF(制表函数)

接收一行,输出多行。

常用的UDTF ----explode(array as 字段名)
常用的UDTF ----explode(map as (key,value))
常用的UDTF ----poseexplode(array as 字段名) 会返回位置,索引
常用的UDTF ----inline(array<STRUCTf1:T1,....fn,Tn> as 字段名)
Latera View:通常与UDTF配合使用。Lateral View可以将UDTF应用到源表的每行数据,将每行数据转换为一行或多行,并将源表中每行的输出结果与该行连接起来,形成一个虚拟表。

eg:

sql">select col1, col2, tmp_table.tmp_col
from test_tb
lateral view explode(split(col3, '分隔符')) tmp_table as tmp_col
where partition_name='xxx' 
sql">-- create table if not exists tb
-- (
--    class    string comment '班级名称',
--    student string comment '学生名称',
--    score   string comment '学生分数'
--)
--    comment '学生成绩表';
--INSERT overwrite table tb
--VALUES ("1班","小A,小B,小C","80,92,70"),
--       ("2班","小D,小E","88,62"),
--       ("3班","小F,小G,小H","90,97,85");select class, student, score,stu_name, stu_score
from tb lateral view posexplode(split(student, ',')) tmp3 as stu_index1, stu_namelateral view posexplode(split(score, ',')) tmp4 as stu_index2, stu_score
where stu_index1 = stu_index2;-- tmp_table:explode形成的新虚拟表,可以不写;
-- tmp_col:explode 形成的新列(字段)

4、窗口函数

窗口函数,function(arg):对应的窗口数据计算函数

function(arg) over (partition by {分区列名} order by {order 列名} desc|asc [rows|range between 起点行 and 终点行])

(1)常用窗口-窗口计算

1)sum(col) over ()

2)avg(col) over ()

3)max(col) over ()

4)min(col) over ()

5)count(col) over ()

6)cume_dist() over (order by col)

    --如果按升序排列,则统计:小于等于当前值的行数/总行数(number of rows ≤ current row)/(total number ofrows)。

    --如果是降序排列,则统计:大于等于当前值的行数/总行数

    eg: cume_dist() over (ORDER BY salary) as cume_dist -- 统计小于等于当前工资的人数占总人数的比例

    cume_dist() over (PARTITION BY dept_no ORDER BY salary) as cume_dist  -- 根据部门统计小于等于当前工资的人数占部门总人数的比例

(2)常用窗口-跨行取值函数

1)first_value(col) over ():首行值

2)last_value(col) over ():末行值

lag和lead:获取当前行的上、下某行、某个字段的值;不支持自定义窗口范围。

3) lag(col,n,defaultValue)  over(partion by..order by..):查询字段col,当前行往前数第n行的数据,若为null显示默认值defaultValue;

        lag(col):指默认每次取字段col当前行的上一行数据

        lag(col, n) over ():取窗口范围往前第 n 行数据的值

4) lead(col, n,defaultValue) over ():取窗口范围往后第 n 行数据的值

5) ntile(n) over(partition by col1 order by col2):col1为分组的列名,col2为排序的列名,将有序分组的窗口范围,平均分成n份,每一份编号依次为1、2、3...、n;如果要取其中第m份,需要用到嵌套子查询

(3)常用窗口-排名函数

row_number() over (partition by col1 order by col2) as row_number

    -- 连续排序。在窗口内会对所有数值,每个组输出的序号唯一且连续,如:1、2、3、4、5。

rank() over (partition by col1 order by col2) as rank

    -- 相同数值,输出相同的序号,而且下一个序号间断,如:1、1、3、3、5。

dense_rank() over (partition by col1 order by col2) as rank

    -- 相同数值,输出相同的序号,但下一个序号不间断,如:1、1、2、2、3。

percent_rank() over():返回order by列的百分比排名

四、导入导出文件

1、load将文件导入hive表中
语法:LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)];
(1)local:表示从本地加载数据到Hive表;否则从HDFS加载数据到Hive表。(如果是本地数据则是复制一份到hive路径,如果是HDFS则是移动到hive路径)
(2)overwrite:表示覆盖表中已有数据,否则表示追加。
(3)partition:表示上传到指定分区,若目标是分区表,需指定分区。

eg:load data local inpath ‘/opt/module/hive/datas/dept_20220401.log’
into table dept_partition partition(day=‘20220401’);

2、将hive查询导出到本地文件

INSERT OVERWRITE LOCAL DIRECTORY '/path/to/local/directory'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
SELECT * FROM your_hive_table;

五、sql使用

1、随机抽样

sql">-- 随机抽样
use dmr_dev;
create table if not exists feature_train_202009 as
(select uid, req_dt, flag, req_month, feature_libsvmfrom tbwhere req_dt='2020-09-28'order by rand()limit 10000
);-- 随机抽样
select * 
from tb
TABLESAMPLE(10 ROWS);-- 随机抽样(百分比)
select * 
from tb 
TABLESAMPLE(10 PERCENT);

2、hive窗口函数去重

sql">use dmr_dev;
set hive.support.quoted.identifiers=none;  
create table if not exists dmr_dev.bussiness_pinkey_all_feature as
(select (num)?+.+from(select row_number() over (partition by req_dt, uid order by req_dt, uid asc) num, *from dmr_dev.all_bussiness_pinkey_all_feature) twhere t.num=1
); 

3、求分位数

sql">-- 分位数
use dmr_dev;
drop table if exists dmr_dev.dmrc_model_anti_fraud_outer_tx_if_result_i_m_array;
create table if not exists dmr_dev.dmrc_model_anti_fraud_outer_tx_if_result_i_m_array as    
selectpercentile_approx(predict_score,array(0.25,0.5,0.75,0.9,0.95)) as predict_score_arr
from (select a.*from(select *from dmr_c.dmrc_model_anti_fraud_outer_tx_if_result_i_mwhere dt = '2021-10-01') ajoin (select count(1) as cntfrom dmr_c.dmrc_model_anti_fraud_outer_tx_if_result_i_mwhere dt = '2021-10-01') bwhere rand(123) < 100000/cnt) tmp;-- 省略ON条件,Hive将尝试进行笛卡尔积(Cartesian product),即将第一个表的每一行与第二个表的每一行组合

4、模型打分分箱,效果分析

sql">-- 基于3求分位数后,模型打分分箱
-- (,arr[0]]   1
-- (arr[0], arr[1]]   2
-- (arr[1], arr[2]]   3
-- (arr[2], arr[3]]   4
-- (arr[3], arr[4]]   5
-- (arr[4], )    6CREATE TEMPORARY MACRO score_grp(x double,arr array<double>) case when x<=arr[0] then 1 when x<=arr[1] then 2 when x<=arr[2] then 3 when x<=arr[3] then 4 when x<=arr[4] then 5 when x>arr[4] then 6 end;use dmr_dev;
drop table if exists dmr_dev.dmrc_model_anti_fraud_outer_tx_if_result_i_m_score;
create table if not exists dmr_dev.dmrc_model_anti_fraud_outer_tx_if_result_i_m_score as
select a.*,score_grp(a.predict_score, b.predict_score_arr) as predict_score_grp
from 
(   select *from dmr_c.dmrc_model_anti_fraud_outer_tx_if_result_i_mwhere dt = '2021-10-01' 
) a
left join dmr_dev.dmrc_model_anti_fraud_outer_tx_if_result_i_m_array b;
-- 此处省略on条件-- 模型效果分析
select predict_score_grp, count(1) as cnt
from dmr_dev.dmrc_model_anti_fraud_outer_tx_if_result_i_m_score
group by predict_score_grp
order by predict_score_grp;


http://www.ppmy.cn/news/1516531.html

相关文章

less -- 总结 01 -(增删改查)

less的使用 // 下载插件 easy-less // 新建文件&#xff0c;后缀名是less&#xff0c;会自动生成一个后缀名为css的文件// 浏览器只认识 html css js // less css 是一种动态样式语言&#xff0c;属于 css预处理语言的一种&#xff0c;它使用类似 css的语法&#xff0c;为 cs…

解除 Excel 表格的文档保护全攻略

在日常工作和学习中&#xff0c;我们可能会遇到 Excel 表格被保护无法编辑的情况。别担心&#xff0c;今天就为大家分享几种解除 Excel 表格文档保护的方法。 一、导入腾讯文档 可以将受保护的 Excel 表格上传到腾讯文档。在部分情况下&#xff0c;腾讯文档会尝试自动解除表…

Unity3D UI Toolkit数据动态绑定详解

前言 在Unity3D中&#xff0c;Compute Shader是一种强大的工具&#xff0c;用于在GPU上执行并行计算任务&#xff0c;这些任务通常涉及大量的数据处理&#xff0c;如图像处理、物理模拟等。然而&#xff0c;由于GPU的并行特性&#xff0c;Compute Shader中的线程&#xff08;也…

归并排序与其例题

一、归并排序的简述 归并排序&#xff08;Merge Sort&#xff09;是一种高效的排序算法&#xff0c;采用分治法&#xff08;Divide and Conquer&#xff09;的策略。它的基本思想是将一个大的问题分解成多个小问题&#xff0c;然后解决这些小问题&#xff0c;最后将结果合并起…

pnpm快速入门

pnpm快速入门 1.使用pnpm启动项目 pnpm是一个优化的包管理器&#xff0c;它通过锁定工作树的方式来减少依赖安装的开销。要在pnpm环境中启动项目&#xff0c;首先你需要确保已经全局安装了pnpm。然后按照以下步骤操作 克隆项目&#xff1a;如果项目还没有下载&#xff0c;使用…

Linux基础 - yum、rzsz、vim 使用与配置、gcc/g++的详细解说

目录 一、Linux 软件包管理器 yum A.什么是软件包&#xff1f; B.关于rzsz&#xff0c;yum的配置 1.安装 sz&#xff0c;rz 命令&#xff1a; a.执行命令sz可将linux中的文件传输到Windows中 b.执行rz命令可将Windows中的文件传输到linux 2.scp XXX.tgz 用户名另一台lin…

2024最新FL Studio24.1.1.4285破解版中文安装包百度云网盘下载地址

大家好&#xff0c;今天我要给大家介绍一款音乐制作神器——FL Studio 24.1.1.4285中文版。这款软件可是音乐制作界的翘楚&#xff0c;无论是专业人士还是音乐爱好者&#xff0c;都会为它的强大功能和易用性所折服。 我们来看看FL Studio的特点。 这是一款全能型的音乐工作站&…

el-form中使用v-model和prop实现动态校验

如何在Vue的el-form中使用v-model和prop实现动态校验&#xff0c;包括多个变量控制校验、数组循环校验和字段级条件显示。通过实例演示了如何配合rules和自定义验证函数来确保表单的完整性和有效性。 公式&#xff1a; 动态校验项的v-model的绑定值 el-form的属性 :model的值 …

SystemTap(stap)架构和原理介绍,以及脚本编写举例

1 SystemTap简介 SystemTap是一个诊断Linux系统性能或功能问题的开源工具。它允许开发人员和系统管理员深入研究内核甚至用户空间应用程序的行为&#xff0c;以便发现错误状态、性能问题&#xff0c;或者仅仅为了解系统是如何工作的。它使得对运行时的Linux系统进行诊断调式变…

Windows安装Tomcat10

1. 下载Tomcat Tomcat官网 https://tomcat.apache.org/download-10.cgi ​下载安装jdk17 &#xff1a;jdk-17_windows-x64_bin.exe 配置JAVA环境变量 JAVA_HOME&#xff1a;C:\Program Files\Java\jdk-17 PATH&#xff1a;%Java_Home%\bin;%Java_Home%\jre\bin; 2. 设置环境变…

【13.3 python中的高级文件操作】

python中的高级文件操作 在Python中&#xff0c;除了基本的文件读写和目录操作外&#xff0c;还有一些高级的文件和目录操作&#xff0c;如删除文件、重命名文件和目录、以及获取文件的基本信息等。这些操作通常通过os模块和pathlib模块来实现。下面我将详细介绍这些操作&#…

电脑换硬盘怎么全盘克隆?轻松实现数据迁移

随着科技的不断发展&#xff0c;电脑硬盘的存储容量和读写速度也在不断提升。为了获得更好的电脑使用体验&#xff0c;许多用户会选择更换更大容量、更高效的硬盘。然而&#xff0c;在更换硬盘的过程中&#xff0c;一个关键的问题摆在了我们面前&#xff1a;如何将旧硬盘中的所…

物联网---ESP32

物联网---ESP32 一、TCP/IP协议(互联网协议)二、MQTT协议(通信协议)2.1 MQTT基本原理2.2 连接MQTT服务端 三、ESP323.1 ESP介绍3.2 ESP32连接云端3.2.1 ESP32连接WIFI/MQTT3.2.2 OneNET云端 一、TCP/IP协议(互联网协议) TCP/IP是一组用于互联网及其他网络中数据传输的通信协议…

hutool工具类JSONUtil无法映射全是大写的单词,如何解决

背景 在解析第三方接口数据时&#xff0c;发现有的字段数据没有映射到对应的字段上&#xff0c;还有对于有的字段有空格或换行&#xff0c;也会一同存入数据库。 示例 实体类&#xff1a; public class Goods { private String id;private String unit;private Integer US…

HexView 刷写文件脚本处理工具-命令行介绍(八)-文件合并(/MO /MT)

介绍 /MO 和 /MT 参数:用于将一个或多个文件合并到程序的内部数据存储中。文件读取:使用第2.2.1.2.1节中描述的自动检测文件类型机制来读取文件。合并操作类型:需要选择合并操作的类型。可以选择透明模式(/MT)或不透明模式(/MO),两者不能混合使用。透明模式(/MT):加载的文…

黑神话悟空无法登录服务器怎么办

黑神话悟空游戏在登录的时候会遇到无法登录服务器的问题&#xff0c;玩家可以采用一些有效的方法进行解决&#xff0c;其中最主要的措施就是优化网络环境和减少网络干扰。Rak小编为您整理黑神话悟空无法登录服务器如何解决的步骤及注意事项。 优化网络环境 1、当游戏无法登录服…

使用notepad++将shell脚本转为UNIX格式方法(主要差别在换行符)

sh文件尽量在linux上改&#xff0c;因windows和linux换行符不同&#xff0c;在windows上改后&#xff0c;在linux上改可能会出现换行符错误。 windows换行符 linux换行符 windows环境改换行符方法 使用notepad点 编辑–》文档格式转换–》转换未unix格式。 注&#xff1a;tx…

搭建ELK-Filebeat采集系统日志

1、解压到/data/elk/filebeat mkdir -p /data/elk/filebeat tar -zxf filebeat-7.17.7-linux-x86_64.tar.gz -C /data/elk/filebeat --strip-components1 #--strip-components选项表示从目录级别上去除指定的前缀&#xff0c;以实现更加控制解压的效果 2、修改配置文件 vi /…

【长文细说】20个ElementPlus核心组件以及使用技巧

Element Plus 是一个基于 Vue 3 和 Vite 的组件库&#xff0c;它提供了一套丰富的 UI 组件&#xff0c;用于构建高质量的网页应用程序。Element Plus 是 Element UI 的 Vue 3 版本&#xff0c;Element UI 是一个广泛使用的 Vue 2 组件库。Element Plus 继承了 Element UI 的设计…

Qt5.14.2 操作PostgreSQL 记录

在Qt5.14.2中操作PostgreSQL数据库. #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug>// 初始化数据库连接QSqlDatabase db QSqlDatabase::addDatabase("QPSQL");//qDebug() << "aaaa&qu…