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
如果該外部表不存在則創(chuàng)建
外部表被刪除時只會刪除元數(shù)據(jù)不會刪除數(shù)據(jù)。(hive不認(rèn)為自己擁有這份數(shù)據(jù))
3.導(dǎo)入數(shù)據(jù)
load data inpath ‘/root/hero/archer.txt’ into table dwd_trip_statistics_pdi partition(day=‘2022.7.26’);
4.窗口函數(shù)
定義:實時處理函數(shù),針對多個輸入它可以有多個輸出。不同于聚組函數(shù)只有一個輸出。
核心:分區(qū),排名,框架
? 分區(qū)是針對一個表的某個不同特征值分開一整張表,降低性能損耗。分區(qū)會以文件夾形式存放再該表目錄。
具體再表中會有一個字段表示分區(qū)。
建表側(cè)
partitioned by (day string comment '分區(qū)時間')使用側(cè)
load data local inpath '/root/hero/archer.txt' into table dwd_trip_statistics_pdi partition(day='2022.7.26');?
? 排名是對區(qū)進(jìn)行排名。
語法:
select 窗口函數(shù) over (partition by 用于分組的列名, order by 用于排序的列名
分類:
排名函數(shù):row_number(),rank(),dense_rank()
聚合函數(shù):max(),min(),count(),sum(),avg(),median()
向前向后取值:lag(),lead()
百分位:percent_rank()
取值函數(shù):first_value(),last_value(),nth_value()
分箱函數(shù):ntile()
row_number() 同薪不同名,相當(dāng)于行號,例如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
其他的聚合函數(shù)如max等就是每一列都執(zhí)行一次該函數(shù),每一行都會有結(jié)果
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 學(xué)號)as current_sum, avg( 成績 ) over (ORDER BY 學(xué)號)as current_avg, count( 成績 ) over (ORDER BY 學(xué)號)as current_count, max( 成績 ) over (ORDER BY 學(xué)號)as current_max, min( 成績 ) over (ORDER BY 學(xué)號)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 '分?jǐn)?shù)' ) comment '窗口函數(shù)分區(qū)和排名測試' 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如果有兩個成績相同的不影響,正常排序是連續(xù)的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會并排但是后一個是連續(xù)的排名注意:rowfromat 得放在partitioned后面
5.Hbase
常用命令:
啟動客戶端 bin/hbase shall
查看庫里的表 list
新建表 (必須指定表名和列簇名) create ‘table_name’,‘列簇名’
表的詳細(xì)描述 describe xxx
放入數(shù)據(jù) put ‘table_name’,‘’
(添加depandency依賴需要在dependencies標(biāo)簽里)
-- 啟動關(guān)閉相關(guān) -- 1.啟動hbase bin/start-hbase.sh -- 2.查看啟動情況, -- 單機(jī)版只會有 HMaster 進(jìn)程 jps -- 3.關(guān)閉hbase bin/stop-hbase.sh-- 基礎(chǔ)命令 -- 1.進(jìn)入 HBase 客戶端命令行(在/目錄 bin/hbase shell -- 2.查看幫助命令 help -- 3.查看當(dāng)前數(shù)據(jù)庫中有哪些表 list-- 表空間 -- 1.創(chuàng)建namespace create_namespace 'nametest' -- 2.刪除namespace drop_namespace 'nametest' -- 3.查看namespace describe_namespace 'nametest' -- 4.列出所有namespace list_namespace -- 5.在namespace下創(chuàng)建表 create 'nametest:testtable', 'fm1' ,'fm2' -- 6.查看namespace下的表 list_namespace_tables 'nametest' -- 表的操作 -- 1.創(chuàng)建表 , student 為表名,info為列族 create 'student','info' -- 2.插入數(shù)據(jù)到表 1001 為rowkey , info:sex 為列族和列名,male為值,更新數(shù)據(jù)時也用put命令 put 'student','1001','info:sex','male' put 'student','1002','info:sex','female' -- 3.掃描查看表數(shù)據(jù) scan 'student' scan 'student',{LIMIT=>10}//LIMIT限制的是rowkey數(shù)量,比如兩個rowkey每個有兩個version一共四個數(shù)據(jù),但是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是指墓碑標(biāo)記,hbase數(shù)據(jù)被刪除時不會立刻在磁盤上刪除,而是打上墓碑標(biāo)記,下次major compaction的時候會刪除,raw參數(shù)必須和version參數(shù)一起使用,但是不能和column參數(shù)一起使用 還有一個參數(shù)是reverse,反序讀取數(shù)據(jù) https://hbase.apache.org/book.html#_commands -- 4.查看表結(jié)構(gòu) describe `student` exists xxx//判斷是否有這個表 is_enabled xxx //判斷表是否啟用 is_disabled xxx//判斷表是否開啟 -- 5.更新指定字段的數(shù)據(jù)//需要注意的是更新和插入數(shù)據(jù)都是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.查看“指定行”或“指定列族:列”的數(shù)據(jù) 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的數(shù)據(jù),這個也是左閉右開區(qū)間 get 't1','r1',{COLUMN=>[C1,C2,C3]}//顯示三個列族 get 't1','r1',{COLUMN=>'C1',TIMESTAMP=>ts1}//顯示c1列族,時間戳為ts1的數(shù)據(jù) scan 'xcw',{columns=>'info:name'}//查看一整列-- 7.統(tǒng)計表數(shù)據(jù)行數(shù) count 'student' -- 8.刪除數(shù)據(jù) -- 刪除某 rowkey 的全部數(shù)據(jù): deleteall 'student','1001' -- 刪除某 rowkey 的某一列數(shù)據(jù):delete 'student','1002','info:sex' -- 9.清空表數(shù)據(jù)//保留表結(jié)構(gòu).需要先關(guān)閉表 truncate 'student' -- 提示:清空表的操作順序為先 disable,然后再 truncate -- 10.刪除表 -- 首先需要先讓該表為 disable 狀態(tài) disable 'student' -- 然后才能 drop 這個表: drop 'student' -- 提示:如果直接 drop 表,會報錯:ERROR: Table student is enabled. Disable it first. -- 11.變更表信息 -- 將 info 列族中的數(shù)據(jù)存放 3 個版本: 改version的時候必須指定列族,不然不識別參數(shù) alter 'student',{NAME=>'info',VERSIONS=>3} get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}1.概念
表被拆成小塊存儲,叫Regions,他們存放再RegionServer上,Master進(jìn)程也就是HMaster(Master的具體實現(xiàn))。Master負(fù)責(zé)Region的分發(fā)。RegionServer中除了Regions外還有Hlog和HFile兩種文件。hlog是預(yù)寫日志文件,HFile是真實的數(shù)據(jù)存儲文件。需要注意的是都是列式存儲。方便檢索,檢索時不用把一整條數(shù)據(jù)掃描完。一個表會有若干個列簇,下包含列。
HLOG
RegionServer操作時的所有記錄,也叫WAL write ahead log預(yù)寫日志,存儲在HDFS中,會保存客戶端的操作。
HFile
最終寫到datanode里的文件,默認(rèn)大小是128M(與hdfs一個塊的大小相同)
Region
每個RegionServer會有若干個Region,會有一個起始和終止的rowkey記錄。一開始只有一個region,當(dāng)大小達(dá)到一定閾值就會分割成兩個region。
RegionServer
內(nèi)存有兩個部分,一個是memstore,一個是BlockCache,前者主要用來寫,后者用來讀。
有個特殊的RegionServer是存儲root信息的server,會有兩個表,一個是root表不可切分只有一個,還有一個是meta表可以被分為多個region,其他的regionserver也會存儲meta表記錄自己的meta信息
Store
一個Region會有多個Store。每個Store對應(yīng)一個列族。store分為memstore(默認(rèn)128M時flush),和storefile
? memstore是再內(nèi)存中緩存的數(shù)據(jù),當(dāng)?shù)竭_(dá)128M后,RegionServer會啟動flasheatch把memstore持久化到storefile,每次會場形成一個單獨的storefile,
? 客戶端檢索時。會在memstore中先檢索,找不到則再storefile中查找。
? store是用Hfile存儲的,Hbase用store的大小來判斷是否應(yīng)該切分region
RowKey
類似于主鍵的東西,存儲為String,行的唯一標(biāo)識。regionserver存放數(shù)據(jù)時根據(jù)rowkey的字典序存放數(shù)據(jù)。
Cell
由{rowkey, column Family:column Qualifier, time Stamp} (行鍵,列族和列)唯一確定的單元。cell 中的數(shù) 據(jù)是沒有類型的,全部是字節(jié)碼形式存貯
Version
每個cell都可存儲多個數(shù)據(jù),也就是多個版本,根據(jù)時間戳(timestamp區(qū)分是long類型)區(qū)分。默認(rèn)是三個版本,可以單獨設(shè)置
2.表的構(gòu)成
HBase模式里的邏輯實體包括:
(1)表(table):HBase用表來組織數(shù)據(jù)。表名是字符串(String),由可以在文件系統(tǒng)路徑里使用的字符組成。
(2)行(row):在表里,數(shù)據(jù)按行存儲。行由行鍵(rowkey)唯一標(biāo)識。行鍵沒有數(shù)據(jù)類型,總是視為字節(jié)數(shù)組byte 。
(3)列族(column family):行里的數(shù)據(jù)按照列族分組,列族也影響到HBase數(shù)據(jù)的物理存放,因此,它們必須事前定義并且不輕易修改。表中每行擁有相同列族,盡管行不需要在每個列族里存儲數(shù)據(jù)。列族名字是字符串(String),由可以在文件系統(tǒng)路徑里使用的字符組成。
(4)列限定符(column qualifier):列族里的數(shù)據(jù)通過列限定符或列來定位。列限定符不必事前定義,列限定符不必在不同行之間保持一致。就像行鍵一樣,列限定符沒有數(shù)據(jù)類型,總是視為字節(jié)數(shù)組byte 。
(5)單元(cell):行鍵、列族和列限定符一起確定一個單元。存儲在單元里的數(shù)據(jù)稱為單元值(value)。值也沒有數(shù)據(jù)類型,總是視為字節(jié)數(shù)組byte 。
(6)時間版本(version):單元值有時間版本。時間版本用時間戳標(biāo)識,是一個long。沒有指定時間版本時,當(dāng)前時間戳作為操作的基礎(chǔ)。HBase保留單元值時間版本的數(shù)量基于列族進(jìn)行配置,默認(rèn)數(shù)量是3個。
HBase的每個數(shù)據(jù)值使用坐標(biāo)來訪問。一個值的完整坐標(biāo)包括行鍵、列族、列限定符和時間版本。由于把所有坐標(biāo)視為一個整體,因此HBase可以看作是一個鍵值(key-value)數(shù)據(jù)庫。
3.寫流程
客戶端發(fā)起請求后,同時向wal(Write ahead log也叫Hlog)預(yù)寫日志和memstore(內(nèi)存)同時寫入數(shù)據(jù)。兩邊都寫完才算動作完成,
當(dāng)memstore到達(dá)固定大小,數(shù)據(jù)會flush到磁盤,形成一個HFile。也就是存儲到hdfs中
4.讀流程
客戶端向zookeeper發(fā)送請求,zookeeper返回hbase存儲meta數(shù)據(jù)的server,返回對應(yīng)的regionserver,這個regionserver多個region分區(qū)并發(fā)查找,先從memstore上讀取,如果沒有則去blockCache上讀取,如果還沒有則取HFile上讀取。
先把該數(shù)據(jù)索引寫到blockCache中,然后再返回客戶端
第二個視角
第一步:客戶端詢問ZooKeeper,-ROOT-在哪里?
第二步:ZooKeeper回復(fù)客戶端,-ROOT-在RegionServer RS1上面。
第三步:客戶端詢問在RS1上的-ROOT-表,哪一個.META. region可以找到表T1里的行00007?
第四步:RS1上的-ROOT-表回復(fù)客戶端,在RegionServer RS3上的.META. region M2可以找到。
第五步:客戶端詢問RS3上的.META. region M2,在哪一個region上可以找到表T1里的行00007以及哪一個RegionServer為它提供服務(wù)?
第六步:RS3上的.META. region M2回復(fù)客戶端,數(shù)據(jù)在RegionServer RS3上面的region T1R3上。
第七步:客戶端發(fā)消息給RS3上面的region T1R3,要求讀取行00007。
第八步:RS3上面的region T1R3將數(shù)據(jù)返回給客戶端。
5.刪除和合并操作
數(shù)據(jù)刪除時并不是直接刪除,而是打上墓碑標(biāo)記(shell中raw=true參數(shù)搭配version可以顯示)。大合并時這些數(shù)據(jù)才會在磁盤清除。
合并分為大合并和小合并,大合并是把小合并的HFile合并。
疑問區(qū)
1.業(yè)務(wù)表為什么用外部表,后續(xù)如何管理?
2.反復(fù)提及的NLP和VCF是啥
3.rowkey工程中一邊怎么設(shè)計
總結(jié)
以上是生活随笔為你收集整理的hive窗口函数和hive基础使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SqlServer】不允许保存更改。您
- 下一篇: 树莓派-迅雷远程下载