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外还有HlogHFile两种文件。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基础使用相关推荐

  1. HiveQL学习笔记(四):Hive窗口函数

    本系列是本人对Hive的学习进行一个整理,主要包括以下内容: 1.HiveQL学习笔记(一):Hive安装及Hadoop,Hive原理简介 2.HiveQL学习笔记(二):Hive基础语法与常用函数 ...

  2. Hive(二)基础教程

    Hive(二)基础教程@你宝爷 一.常用交互命令 #beeline jdbc 启动客户端,可多线程访问,hive不可以 $HIVE_HOME/bin/beeline -u jdbc:hive2://h ...

  3. 【数据仓库】Hive环境搭建和基础用法

    简介 Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,是一个可以对Hadoop中的大规模存储的数据进行查询和分析存储的组件,Hive数据仓库工具能将结构化的数据文件映射为一 ...

  4. 大数据技术-hive窗口函数详解

    有不少同学一听这个标题,hive窗口函数是什么鬼?没听说过还有窗口函数这个东西啊,其实它的用处可大了,下面听小千慢慢道来. hive窗口函数 窗口函数指定了函数工作的数据窗口大小(当前行的上下多少行) ...

  5. 数据仓库组件:Hive环境搭建和基础用法

    本文源码:GitHub || GitEE 一.Hive基础简介 1.基础描述 Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,是一个可以对Hadoop中的大规模存储的数据进 ...

  6. hive后台启动_数据仓库组件:Hive环境搭建和基础用法

    一.Hive基础简介 1.基础描述 Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,是一个可以对Hadoop中的大规模存储的数据进行查询和分析存储的组件,Hive数据仓库工 ...

  7. Hive窗口函数(over/partition by/order by/window/序列函数)总结与实践

    一.简介 本文主要介绍Hive中的窗口函数,Hive中的窗口函数和SQL中的窗口函数相类似,都是用来做一些数据分析类的工作,一般用于olap分析(在线分析处理). 二.概念 我们都知道在sql中有一类 ...

  8. Hive(一)——基础操作

    Hive(一)--基础操作 基础操作 CLI命令行使用!加linux命令可避免退出不退出CLI hive >!ls; hdfs命令可配合管道符加linux命令使用 dfs -cat /test/ ...

  9. 【Hive】(九)Hive 窗口函数总结

    文章目录 一.简介 二.概念 三.数据准备 四.聚合函数+over() 五.partition by 子句 六.order by 子句 七.window 子句 八.窗口函数中的序列函数 ntile r ...

  10. hive窗口函数使用

    hive窗口函数的使用 前言 一.hive窗口函数语法 1.over()窗口函数的语法结构 1.1.over()函数中的三个函数讲解 2.常与over()一起使用的分析函数 2.1.聚合类 2.2.排 ...

最新文章

  1. learning scala read from file
  2. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1055:判断闰年
  3. json和python中字典的区别和联系_Python中 json字符串和字典的区别
  4. 多重索引DataFrame插入数据的方法探索
  5. python中字符串str的strip()方法
  6. pandas object格式转float64格式
  7. dpkg检查某个应用是否已安装
  8. python实现决策树算法
  9. 基于STC89C52单片机的LED显示电子钟的制作
  10. 照片怎么加水印,照片加水印操作步骤
  11. 解决局域网文件传输慢的问题
  12. 团队项目(小小大佬带飞队)
  13. CNN(卷积神经网络)的深度
  14. 补充学习2021.7.21—动态水波进度条
  15. html句号图标,html标点符号相关符号
  16. 模拟器什么的都过时了!这样玩吃鸡才能真正的高清无延迟
  17. 解决WordPress文章页面无法显示的问题
  18. 开源 Python IDE PyScripter设置中文界面
  19. 南开大学计算机党支部书记,程莉莉
  20. Google浏览器网页,大部分网页出现无法加载样式

热门文章

  1. 【汇编语言】DOSBox教程
  2. LSTM神经网络实战
  3. MDT实现windows系统批量部署
  4. pygame的安装与使用
  5. php+将json转字符串,php实现json转字符串的方法
  6. PLC编程从入门到精通视频教程【副业学习会】
  7. openssl、gmssl的简单介绍
  8. 园林景观设计计算机制图,园林景观设计平面图效果图
  9. 软件项目交付件模板整理清单
  10. bp神经网络预测模型实例,bp神经网络模型的建立