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基础使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SqlServer】不允许保存更改。您
- 下一篇: 树莓派-迅雷远程下载