hive窗口函数和hive基础使用
7.27
0.连接客户端
beeline -u jdbc:hive2://localhost:10000
1.建库并使用
create database xxx
use xxx
2.建表
create table xxx
create external table if not exists
如果该外部表不存在则创建
外部表被删除时只会删除元数据不会删除数据。(hive不认为自己拥有这份数据)
3.导入数据
load data inpath ‘/root/hero/archer.txt’ into table dwd_trip_statistics_pdi partition(day=‘2022.7.26’);
4.窗口函数
定义:实时处理函数,针对多个输入它可以有多个输出。不同于聚组函数只有一个输出。
核心:分区,排名,框架
分区是针对一个表的某个不同特征值分开一整张表,降低性能损耗。分区会以文件夹形式存放再该表目录。
具体再表中会有一个字段表示分区。
建表侧
partitioned by (day string comment '分区时间')
使用侧
load data local inpath '/root/hero/archer.txt' into table dwd_trip_statistics_pdi partition(day='2022.7.26');
排名是对区进行排名。
语法:
select 窗口函数 over (partition by 用于分组的列名, order by 用于排序的列名
分类:
排名函数:row_number(),rank(),dense_rank()
聚合函数:max(),min(),count(),sum(),avg(),median()
向前向后取值:lag(),lead()
百分位:percent_rank()
取值函数:first_value(),last_value(),nth_value()
分箱函数:ntile()
row_number() 同薪不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4
rank() 同薪同名,有跳级,例如3000、2000、2000、1000排名后为1、2、2、4
dense_rank() 同薪同名,无跳级,例如3000、2000、2000、1000排名后为1、2、2、3
其他的聚合函数如max等就是每一列都执行一次该函数,每一行都会有结果
select *,max(score) over (partition by day order by score desc )
from olapTest;select *,min(score) over (partition by day order by score desc )
from olapTest;select *,
sum( 成绩 ) over (ORDER BY 学号)as current_sum,
avg( 成绩 ) over (ORDER BY 学号)as current_avg,
count( 成绩 ) over (ORDER BY 学号)as current_count,
max( 成绩 ) over (ORDER BY 学号)as current_max,
min( 成绩 ) over (ORDER BY 学号)as current_min
from 班级表;
sum是每一行累加,然后改行显示的是目前为止的sum
max和min相同
测试代码
create database test4;
use test4;
drop database test4;
drop table if exists olapTest;
create table if not exists olapTest(
id int comment '账号',
name string comment '姓名',
score int comment '分数'
)
comment '窗口函数分区和排名测试'
partitioned by (day string comment '输入日期')
row format delimited fields terminated by '\t'
//stored as Parquet
//TBLPROPERTIES('parquet.compression'='SNAPPY')
;load data local inpath '/data/xcw/olap_data.txt' into table olapTest
partition(day='2022.7.28');select *
from olapTest;select *,row_number() over (partition by id order by score desc )
from olapTest;select *,row_number() over (partition by day order by score desc )
from olapTest;//rownumber如果有两个成绩相同的不影响,正常排序是连续的select *,rank() over (partition by day order by score desc )
from olapTest;//成绩相同会并列,然后会跳过相同成绩到另外的排名比如1224这样select *,dense_rank() over (partition by day order by score desc )
from olapTest;//dense会并排但是后一个是连续的排名
注意:rowfromat 得放在partitioned后面
5.Hbase
常用命令:
启动客户端 bin/hbase shall
查看库里的表 list
新建表 (必须指定表名和列簇名) create ‘table_name’,‘列簇名’
表的详细描述 describe xxx
放入数据 put ‘table_name’,‘’
(添加depandency依赖需要在dependencies标签里)
-- 启动关闭相关
-- 1.启动hbase
bin/start-hbase.sh
-- 2.查看启动情况,
-- 单机版只会有 HMaster 进程
jps
-- 3.关闭hbase
bin/stop-hbase.sh-- 基础命令
-- 1.进入 HBase 客户端命令行(在/目录
bin/hbase shell
-- 2.查看帮助命令
help
-- 3.查看当前数据库中有哪些表
list-- 表空间
-- 1.创建namespace
create_namespace 'nametest'
-- 2.删除namespace
drop_namespace 'nametest'
-- 3.查看namespace
describe_namespace 'nametest'
-- 4.列出所有namespace
list_namespace
-- 5.在namespace下创建表
create 'nametest:testtable', 'fm1' ,'fm2'
-- 6.查看namespace下的表
list_namespace_tables 'nametest' -- 表的操作
-- 1.创建表 , student 为表名,info为列族
create 'student','info'
-- 2.插入数据到表 1001 为rowkey , info:sex 为列族和列名,male为值,更新数据时也用put命令
put 'student','1001','info:sex','male'
put 'student','1002','info:sex','female'
-- 3.扫描查看表数据
scan 'student'
scan 'student',{LIMIT=>10}//LIMIT限制的是rowkey数量,比如两个rowkey每个有两个version一共四个数据,但是limit为2的时候也是显示4个的
//STOP和start是左闭右开,左边start可以连接上,stop取不上
scan 'student',{STARTROW => '1001', STOPROW => '1001'}
scan 'student',{STARTROW => '1001'}
scan 'student',{LIMIT => 10,INTERVAL => 10000,CACHE => 10000}. # 一次查询10000行,cache 为10000.
scan 'xcw_test','0001',{RAW=>TRUE,VERSIONS=>5},RAW是指墓碑标记,hbase数据被删除时不会立刻在磁盘上删除,而是打上墓碑标记,下次major compaction的时候会删除,raw参数必须和version参数一起使用,但是不能和column参数一起使用
还有一个参数是reverse,反序读取数据
https://hbase.apache.org/book.html#_commands
-- 4.查看表结构
describe `student`
exists xxx//判断是否有这个表
is_enabled xxx //判断表是否启用
is_disabled xxx//判断表是否开启
-- 5.更新指定字段的数据//需要注意的是更新和插入数据都是put操作
put 'student','1001','info:name','Nick'
put 'student','1001','info:age','100'
put 'student','1001','info:sex','male'
put 'student','1001','info:age','18'
-- 6.查看“指定行”或“指定列族:列”的数据
get 'student','1001'
get 'student','1001','info'//查看列族的值
get 'student','1001','info:name'//查看列的值
get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
get 'namespacd:table','rowkey'
get 't1','r1',{TIMERANGE=>[TS1,TS2]}//显示时间戳从ts1到ts2的数据,这个也是左闭右开区间
get 't1','r1',{COLUMN=>[C1,C2,C3]}//显示三个列族
get 't1','r1',{COLUMN=>'C1',TIMESTAMP=>ts1}//显示c1列族,时间戳为ts1的数据
scan 'xcw',{columns=>'info:name'}//查看一整列-- 7.统计表数据行数
count 'student'
-- 8.删除数据
-- 删除某 rowkey 的全部数据:
deleteall 'student','1001'
-- 删除某 rowkey 的某一列数据:delete 'student','1002','info:sex'
-- 9.清空表数据//保留表结构.需要先关闭表
truncate 'student'
-- 提示:清空表的操作顺序为先 disable,然后再 truncate
-- 10.删除表
-- 首先需要先让该表为 disable 状态
disable 'student'
-- 然后才能 drop 这个表:
drop 'student'
-- 提示:如果直接 drop 表,会报错:ERROR: Table student is enabled. Disable it first.
-- 11.变更表信息
-- 将 info 列族中的数据存放 3 个版本:
改version的时候必须指定列族,不然不识别参数
alter 'student',{NAME=>'info',VERSIONS=>3}
get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
1.概念
表被拆成小块存储,叫Regions,他们存放再RegionServer上,Master进程也就是HMaster(Master的具体实现)。Master负责Region的分发。RegionServer中除了Regions外还有Hlog和HFile两种文件。hlog是预写日志文件,HFile是真实的数据存储文件。需要注意的是都是列式存储。方便检索,检索时不用把一整条数据扫描完。一个表会有若干个列簇,下包含列。
HLOG
RegionServer操作时的所有记录,也叫WAL write ahead log预写日志,存储在HDFS中,会保存客户端的操作。
HFile
最终写到datanode里的文件,默认大小是128M(与hdfs一个块的大小相同)
Region
每个RegionServer会有若干个Region,会有一个起始和终止的rowkey记录。一开始只有一个region,当大小达到一定阈值就会分割成两个region。
RegionServer
内存有两个部分,一个是memstore,一个是BlockCache,前者主要用来写,后者用来读。
有个特殊的RegionServer是存储root信息的server,会有两个表,一个是root表不可切分只有一个,还有一个是meta表可以被分为多个region,其他的regionserver也会存储meta表记录自己的meta信息
Store
一个Region会有多个Store。每个Store对应一个列族。store分为memstore(默认128M时flush),和storefile
memstore是再内存中缓存的数据,当到达128M后,RegionServer会启动flasheatch把memstore持久化到storefile,每次会场形成一个单独的storefile,
客户端检索时。会在memstore中先检索,找不到则再storefile中查找。
store是用Hfile存储的,Hbase用store的大小来判断是否应该切分region
RowKey
类似于主键的东西,存储为String,行的唯一标识。regionserver存放数据时根据rowkey的字典序存放数据。
Cell
由{rowkey, column Family:column Qualifier, time Stamp} (行键,列族和列)唯一确定的单元。cell 中的数 据是没有类型的,全部是字节码形式存贮
Version
每个cell都可存储多个数据,也就是多个版本,根据时间戳(timestamp区分是long类型)区分。默认是三个版本,可以单独设置
2.表的构成
HBase模式里的逻辑实体包括:
(1)表(table):HBase用表来组织数据。表名是字符串(String),由可以在文件系统路径里使用的字符组成。
(2)行(row):在表里,数据按行存储。行由行键(rowkey)唯一标识。行键没有数据类型,总是视为字节数组byte 。
(3)列族(column family):行里的数据按照列族分组,列族也影响到HBase数据的物理存放,因此,它们必须事前定义并且不轻易修改。表中每行拥有相同列族,尽管行不需要在每个列族里存储数据。列族名字是字符串(String),由可以在文件系统路径里使用的字符组成。
(4)列限定符(column qualifier):列族里的数据通过列限定符或列来定位。列限定符不必事前定义,列限定符不必在不同行之间保持一致。就像行键一样,列限定符没有数据类型,总是视为字节数组byte 。
(5)单元(cell):行键、列族和列限定符一起确定一个单元。存储在单元里的数据称为单元值(value)。值也没有数据类型,总是视为字节数组byte 。
(6)时间版本(version):单元值有时间版本。时间版本用时间戳标识,是一个long。没有指定时间版本时,当前时间戳作为操作的基础。HBase保留单元值时间版本的数量基于列族进行配置,默认数量是3个。
HBase的每个数据值使用坐标来访问。一个值的完整坐标包括行键、列族、列限定符和时间版本。由于把所有坐标视为一个整体,因此HBase可以看作是一个键值(key-value)数据库。
3.写流程
客户端发起请求后,同时向wal(Write ahead log也叫Hlog)预写日志和memstore(内存)同时写入数据。两边都写完才算动作完成,
当memstore到达固定大小,数据会flush到磁盘,形成一个HFile。也就是存储到hdfs中
4.读流程
客户端向zookeeper发送请求,zookeeper返回hbase存储meta数据的server,返回对应的regionserver,这个regionserver多个region分区并发查找,先从memstore上读取,如果没有则去blockCache上读取,如果还没有则取HFile上读取。
先把该数据索引写到blockCache中,然后再返回客户端
第二个视角
第一步:客户端询问ZooKeeper,-ROOT-在哪里?
第二步:ZooKeeper回复客户端,-ROOT-在RegionServer RS1上面。
第三步:客户端询问在RS1上的-ROOT-表,哪一个.META. region可以找到表T1里的行00007?
第四步:RS1上的-ROOT-表回复客户端,在RegionServer RS3上的.META. region M2可以找到。
第五步:客户端询问RS3上的.META. region M2,在哪一个region上可以找到表T1里的行00007以及哪一个RegionServer为它提供服务?
第六步:RS3上的.META. region M2回复客户端,数据在RegionServer RS3上面的region T1R3上。
第七步:客户端发消息给RS3上面的region T1R3,要求读取行00007。
第八步:RS3上面的region T1R3将数据返回给客户端。
5.删除和合并操作
数据删除时并不是直接删除,而是打上墓碑标记(shell中raw=true参数搭配version可以显示)。大合并时这些数据才会在磁盘清除。
合并分为大合并和小合并,大合并是把小合并的HFile合并。
疑问区
1.业务表为什么用外部表,后续如何管理?
2.反复提及的NLP和VCF是啥
3.rowkey工程中一边怎么设计
hive窗口函数和hive基础使用相关推荐
- HiveQL学习笔记(四):Hive窗口函数
本系列是本人对Hive的学习进行一个整理,主要包括以下内容: 1.HiveQL学习笔记(一):Hive安装及Hadoop,Hive原理简介 2.HiveQL学习笔记(二):Hive基础语法与常用函数 ...
- Hive(二)基础教程
Hive(二)基础教程@你宝爷 一.常用交互命令 #beeline jdbc 启动客户端,可多线程访问,hive不可以 $HIVE_HOME/bin/beeline -u jdbc:hive2://h ...
- 【数据仓库】Hive环境搭建和基础用法
简介 Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,是一个可以对Hadoop中的大规模存储的数据进行查询和分析存储的组件,Hive数据仓库工具能将结构化的数据文件映射为一 ...
- 大数据技术-hive窗口函数详解
有不少同学一听这个标题,hive窗口函数是什么鬼?没听说过还有窗口函数这个东西啊,其实它的用处可大了,下面听小千慢慢道来. hive窗口函数 窗口函数指定了函数工作的数据窗口大小(当前行的上下多少行) ...
- 数据仓库组件:Hive环境搭建和基础用法
本文源码:GitHub || GitEE 一.Hive基础简介 1.基础描述 Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,是一个可以对Hadoop中的大规模存储的数据进 ...
- hive后台启动_数据仓库组件:Hive环境搭建和基础用法
一.Hive基础简介 1.基础描述 Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,是一个可以对Hadoop中的大规模存储的数据进行查询和分析存储的组件,Hive数据仓库工 ...
- Hive窗口函数(over/partition by/order by/window/序列函数)总结与实践
一.简介 本文主要介绍Hive中的窗口函数,Hive中的窗口函数和SQL中的窗口函数相类似,都是用来做一些数据分析类的工作,一般用于olap分析(在线分析处理). 二.概念 我们都知道在sql中有一类 ...
- Hive(一)——基础操作
Hive(一)--基础操作 基础操作 CLI命令行使用!加linux命令可避免退出不退出CLI hive >!ls; hdfs命令可配合管道符加linux命令使用 dfs -cat /test/ ...
- 【Hive】(九)Hive 窗口函数总结
文章目录 一.简介 二.概念 三.数据准备 四.聚合函数+over() 五.partition by 子句 六.order by 子句 七.window 子句 八.窗口函数中的序列函数 ntile r ...
- hive窗口函数使用
hive窗口函数的使用 前言 一.hive窗口函数语法 1.over()窗口函数的语法结构 1.1.over()函数中的三个函数讲解 2.常与over()一起使用的分析函数 2.1.聚合类 2.2.排 ...
最新文章
- learning scala read from file
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1055:判断闰年
- json和python中字典的区别和联系_Python中 json字符串和字典的区别
- 多重索引DataFrame插入数据的方法探索
- python中字符串str的strip()方法
- pandas object格式转float64格式
- dpkg检查某个应用是否已安装
- python实现决策树算法
- 基于STC89C52单片机的LED显示电子钟的制作
- 照片怎么加水印,照片加水印操作步骤
- 解决局域网文件传输慢的问题
- 团队项目(小小大佬带飞队)
- CNN(卷积神经网络)的深度
- 补充学习2021.7.21—动态水波进度条
- html句号图标,html标点符号相关符号
- 模拟器什么的都过时了!这样玩吃鸡才能真正的高清无延迟
- 解决WordPress文章页面无法显示的问题
- 开源 Python IDE PyScripter设置中文界面
- 南开大学计算机党支部书记,程莉莉
- Google浏览器网页,大部分网页出现无法加载样式