亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hive常見表結構是什么

發布時間:2022-08-11 11:21:36 來源:億速云 閱讀:160 作者:iii 欄目:開發技術

這篇文章主要介紹“hive常見表結構是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“hive常見表結構是什么”文章能幫助大家解決問題。

hive簡介

hive是基于Hadoop的一個數據倉庫工具,用來進行數據提取、轉化、加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。hive數據倉庫工具能將結構化的數據文件映射為一張數據庫表,并提供SQL查詢功能,能將SQL語句轉變成MapReduce任務來執行。Hive的優點是學習成本低,可以通過類似SQL語句實現快速MapReduce統計,使MapReduce變得更加簡單,而不必開發專門的MapReduce應用程序。hive十分適合對數據倉庫進行統計分析。

1.外部表

當文件已經存在或位于遠程位置時,我們可以使用外部表,外部表的存儲由自己指定。

特點:刪除表,數據依然存在

建表語句

CREATE EXTERNAL TABLE tmp_xx(id int,name String);

2.內部表

hive管理控制表的整個生命周期,存儲位置在hive.metastore.warehouse.dir目錄下。

特點:刪除表時,數據也被刪除

建表語句

CREATE TABLE tmp_xx(id int,name String);

3.分區表

把一個表的數據以分區字段的值作為目錄去存儲。

特點:

  • 縮小了硬盤掃描數據的區域,減少磁盤IO

  • 將表數據存儲在多個分區目錄,便于獨立管理(創建,刪除)數據

存儲結構如下

hive常見表結構是什么

1.靜態分區

在執行前就知道分區的值

  • 可以根據PARTITIONED BY創建分區表,一個表可以擁有一個或者多個分區,每個分區以文件夾的形式單獨存在表文件夾的目錄下。

  • 分區是以字段的形式在表結構中存在,通過describe table命令可以查看到字段存在,但是該字段不存放實際的數據內容,僅僅是分區的表示。

  • 分區建表分為2種,一種是單分區,也就是說在表文件夾目錄下只有一級文件夾目錄。另外一種是多分區,表文件夾下出現多文件夾嵌套模式。

單分區相關語法

#單分區表創建
CREATE TABLE tmp_xx(id int,name String) partitioned by (d string);
 
#添加分區
ALTER TABLE tmp_partition ADD IF NOT EXISTS PARTITION (d='20220628')
 
#刪除分區
ALTER TABLE tmp_partition DROP IF EXISTS PARTITION (d='20220628')
 
#數據寫入
INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629')
SELECT id, name FROM tmp_yy limit 10;
 
#查看分區數據
select * from tmp_xx where d='20220629'
 
#查看表分區
show partitions table;
 
#查看目錄
hadoop dfs -du -h /user/hive/warehouse/tmp_xxx

多分區相關語法

#多分區表創建
CREATE TABLE tmp_xx(id int,name String) partitioned by (d String,h String);
 
#數據寫入
INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629',h='15')
SELECT id, name FROM tmp_yy limit 10;
 
#查看分區數據
select * from tmp_xx where d='20220629' and h='15'

2.動態分區

執行時才知道分區的值,相比于靜態分區可以一次寫入多個分區數據,而不用在每次分區寫入的時候一次執行多次insert,其他的地方和靜態分區都是一樣的。

特點:

  • 在INSERT … SELECT …查詢中,必須在SELECT語句中的列中最后指定動態分區列,并按PARTITION()子句中出現的順序進行排列

  • 如果動態分區和靜態分區一起使用,必須是靜態分區的字段在前,動態分區的字段在后。

想要使用動態分區需要hive開啟動態分區,參數如下

set hive.exec.dynamic.partition=true;   --開啟動態分區 默認為false,不開啟
set hive.exec.dynamic.partition.mode=nonstrict; --指定動態分區模式,默認為strict
 
下面參數可選
SET hive.exec.max.dynamic.partitions=2048; 
SET hive.exec.max.dynamic.partitions.pernode=256; 
SET hive.exec.max.created.files=10000; 
SET hive.error.on.empty.partition=true;

語法:

#寫入數據
INSERT overwrite TABLE tmp_partition PARTITION(d)
SELECT id,NAME,d FROM tmp_xxx
 
#寫入多分區數據
INSERT overwrite TABLE tmp_partition PARTITION(d,h)
SELECT id,NAME,d,h FROM tmp_xxx
 
#混合分區使用,使用動態分區和靜態分區,靜態分區必須在前
INSERT overwrite TABLE tmp_partition PARTITION(d='20220629',h)
SELECT id,NAME,h FROM tmp_xxx

4.分桶表

對比分區表,分桶表是對數據進行更加細粒度的劃分。一般用的比較少,在數據量比較小的時候使用分桶表可能性能更差。

分桶表將整個數據內容按照分桶字段的哈希值進行區分,使用該哈希值除以桶的個數得到取余數,bucket_id = column.hashcode % bucket.num,余數決定了該條記錄會被分在哪個桶中。余數相同的記錄會分在一個桶里。需要注意的是,在物理結構上,一個桶對應一個文件,而分區表只是一個目錄,至于目錄下有多少數據是不確定的。

分桶表和分區表的區別

分區表分桶表
存儲結構文件目錄/文件夾
創建語句partitioned byclustered by,指定桶個數
數量分區個數可增長分桶數指定后不在增長
用途避免掃描全表,通過分區列指定查詢目錄提高查詢速度抽樣及大表join時提高效率

想要使用分桶表需要開啟分桶機制,默認開啟

set hive.enforce.bucketing=true

建表

CREATE TABLE tmp_bucket(id INT,NAME STRING) clustered BY (id) INTO 4 buckets

寫入數據之后查看文件結構,發現表文件夾下有4個文件,說明分桶成功

hive常見表結構是什么

1.抽樣

#建表
select columns from table tablesample(bucket x out of y on column);
-- x:表示從第幾個分桶進行抽樣
-- y:表示每隔幾個分桶取一個分桶,y必須為表bucket的整數倍或者因子
 
#從分桶表的建表語句中可知,我們一共分了4個桶,所以我們這里x取1,y取2
一共抽取2(4/2)個桶,從第一個桶開始,每隔2個桶抽取一次,即第一個桶和
第三個桶。
SELECT id,NAME FROM tmp_bucket tablesample(bucket 1 OUT of 2 ON id) LIMIT 10

2.map-side join

獲得更高的查詢處理效率。桶為表加上了額外的結構,Hive 在處理有些查詢時能利用這個結構。

具體而言,連接兩個在(包含連接列的)相同列上劃分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實現。比如JOIN操作。對于JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作。那么將保存相同列值的桶進行JOIN操作就可以,可以大大較少JOIN的數據量。

需要注意的是這種方式只適用于大表,小表不適用,表的大小至少得幾個G或幾個T,此功能未做測試。

5.表的文件存儲格式

  • STORED AS 指定表的文件存儲格式默認TEXT FILE(文本文件)格式存儲,

  • 默認存儲格式可通過hive.default.fileformat配置修改

  • 其它常用存儲格式 Parquet(列式),Avro,ORC(列式),Sequence File,INPUT FORMAT & OUTPUT FORMAT (二進制)

1.TEXTFILE

STORED AS INPUTFORMAT                              
   'org.apache.hadoop.mapred.TextInputFormat'       
 OUTPUTFORMAT                                       
   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

純文本文件存儲,TEXTFILE默認是hive的默認存儲方式,用戶可以通過配置 hive.default.fileformat 來修改。

在HDFS上可直接查看數據,可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但是使用這種方式,hive不會對數據進行切分,無法對數據進行并行操作。

存儲方式:行存儲

優勢:可使用任意的分割符進行分割;在hdfs上可查可標記;加載速度較快;

劣勢:不會對數據進行壓縮處理,存儲空間較大、磁盤開銷大、數據解析開銷大。

2.SEQUENCEFILE

STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.SequenceFileInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.mapred.SequenceFileOutputFormat'

存儲為壓縮的序列化文件。是hadoop中的標準序列化文件,可壓縮,可分塊。SequenceFile是一個由二進制序列化過的key/value的字節流組成的文本存儲文件,它可以在map/reduce過程中的input/output 的format時被使用。

SequenceFile 有三種壓縮態:

  • Uncompressed – 未進行壓縮的狀

  • record compressed - 對每一條記錄的value值進行了壓縮(文件頭中包含上使用哪種壓縮算法的信息)

  • block compressed – 當數據量達到一定大小后,將停止寫入進行整體壓縮,整體壓縮的方法是把所有的keylength,key,vlength,value 分別合在一起進行整體壓縮,塊的壓縮效率要比記錄的壓縮效率高 hive中通過設置SET mapred.output.compression.type=BLOCK;來修改SequenceFile壓縮方式。

存儲方式:行存儲

優勢:存儲時候會對數據進行壓縮處理,存儲空間小;支持文件切割分片;查詢速度比TestFile速度快;

劣勢:無法可視化展示數據;不可以直接使用load命令對數據進行加載;自身的壓縮算法占用一定的空間

3.RCFILE

STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'

文件存儲方式為二進制文件。以RcFile文件格式存儲的表也會對數據進行壓縮處理,在HDFS上以二進制格式存儲,不可直接查看。

RCFILE是一種行列存儲相結合的存儲方式,該存儲結構遵循的是“先水平劃分,再垂直劃分”的設計里面。首先,將數據按行分塊形成行組,這樣可以使同一行的數據在一個節點上。然后,把行組內的數據列式存儲,將列維度的數據進行壓縮,并提供了一種lazy解壓技術。

Rcfile在進行數據讀取時會順序處理HDFS塊中的每個行組,讀取行組的元數據頭部和給定查詢需要的列,將其加載到內存中并進行解壓,直到處理下一個行組。但是,rcfile不會解壓所有的加載列,解壓采用lazy解壓技術,只有滿足where條件的列才會被解壓,減少了不必要的列解壓。

在rcfile中每一個行組的大小是可變的,默認行組大小為4MB。行組變大可以提升數據的壓縮效率,減少并發存儲量,但是在讀取數據時會占用更多的內存,可能影響查詢效率和其他的并發查詢。用戶可根據具體機器和自身需要調整行組大小。

存儲方式:行列混合的存儲格式,將相近的行分塊后,每塊按列存儲。

優勢:基于列存儲,壓縮快且效率更高,;占用的磁盤存儲空間小,讀取記錄時涉及的block少,IO小;查詢列時,讀取所需列只需讀取列所在塊的頭部定義,讀取速度快(在讀取全量數據時,性能與Sequence沒有明顯區別);

劣勢:無法可視化展示數據;導入數據時耗時較長;不能直接使用load命令對數據進行加載;自身的壓縮算法占用一定空間,但比SequenceFile所占空間稍小;

4.ORC

ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
  STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

ORC (Optimized Record Columnar)是RC File 的改進,主要在壓縮編碼、查詢性能上進行了升級; ORC具備一些高級特性,如:update操作,支持ACID,支持struct、array復雜類型。Hive1.x版本后支持事務和update操作,就是基于ORC實現的(目前其他存儲格式暫不支持)。

存儲方式:按行組分割整個表,行組內進行列式存儲。數據按行分塊,每塊按照列存儲

文件結構:

首先做一些名詞注釋:

ORC文件:保存在文件系統上的普通二進制文件,一個ORC文件中包含多個stripe,每個stripe包含多條記錄,這些記錄按照列進行獨立存儲。

文件級元數據:包括文件的描述信息postscript、文件meta信息(包括整個文件的統計信息)、所有的stripe的信息和schema信息。

Stripe:一組行形成一個stripe,每次讀取文件是以行組為單位的,一般為hdfs的塊大小,保存了每一列的索引和數據。

Stripe元數據:保存stripe的位置、每個列在該stripe的統計信息以及所有的stream類型和位置。

Row group:索引的最小單位,一個stripe中包含多個row group,默認為10000個值組成。

Stream:一個stream表示文件中的一段有效的數據,包括索引和數據。索引stream保存每一個row group的位置和統計信息,數據stream包括多種類型的數據,具體情況由該列類型和編碼方式決定。

在ORC文件中保存了三個層級的統計信息,分別為文件級別、stripe級別和row group級別,他們可以根據下發的搜索參數判斷是否可以跳過某些數據。在這些統計信息中包含成員數和是否有null值,且對不同類型的數據設置了特定統計信息。

ORC的文件結構如下:

hive常見表結構是什么

文件級別:

在ORC文件的末尾記錄了文件級別的統計信息,包括整個文件的列統計信息。這些信息主要是用于查詢的優化,也可以為一些簡單的聚合查詢如max、min、sum輸出結果。

Stripe級別:

保留行級別的統計信息,用于判斷該Stripe中的記錄是否符合where中的條件,是否需要被讀取。

Row group級別:

進一步避免讀取不必要的數據,在邏輯上將一個column的index分割成多個index組(默認為10000,可配置)。以這些index記錄為一個組,對數據進行統計。在查詢時可根據組級別的統計信息過濾掉不必要的數據。

優勢:具有很高的壓縮比,且可切分;由于壓縮比高,在查詢時輸入的數據量小,使用的task減少,所以提升了數據查詢速度和處理性能;每個task只輸出單個文件,減少了namenode的負載壓力;在ORC文件中會對每一個字段建立一個輕量級的索引,如:row group index、bloom filter index等,可以用于where條件過濾;可使用load命令加載,但加載后select * from xx;無法讀取數據;查詢速度比rcfile快;支持復雜的數據類型;

劣勢:無法可視化展示數據;讀寫時需要消耗額外的CPU資源用于壓縮和解壓縮,但消耗較少;對schema演化支持較差;

5.Parquet

ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
  STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'

Parquet 最初的設計動機是存儲嵌套式數據,,比如Protocolbuffer,thrift,json等,將這類數據存儲成列式格式,以方便對其高效壓縮和編碼,且使用更少的IO操作取出需要的數據。總的來說Parquet與orc相比的主要優勢是對嵌套結構的支持,orc的多層級嵌套表達復雜底層未采用google dremel類似實現,性能和空間損失較大。

存儲方式:列式存儲

優勢:具有高效壓縮和編碼,是使用時有更少的IO取出所需數據,速度比ORC快;其他方面類似于ORC;

劣勢:不支持update;不支持ACID;不支持可視化展示數據

 
 ORCParquet
存儲方式列存儲列存儲
嵌套式結構orc的多層級嵌套表達復雜且底層未采用google dremel類似實現,性能和空間損失較大支持比較完美
ACID支持不支持
update操作支持不支持
索引粗粒度索引,block/group/chuck級別統計信息粗粒度索引,file/stripe/row級別統計信息,不能精確到列建索引。
查詢性能比parquet稍高比ORC稍低
壓縮

6.總結

需要查看到所存儲的具體數據內容的小型查詢,可以采用默認文件格式textfile。不需要查看具體數據的小型查詢時可使用sequencefile文件格式。當用于大數據量的查詢時,可以使用rcfile、ORC、parquet,一般情況下推薦使用ORC,若字段數較多,不涉及到更新且取部分列查詢場景多的情況下建議使用parquet。

需要通過sqoop+hive與關系型數據庫交互時,import和export的hive表需要是textfile格式。如果需要操作的表不是此存儲格式,需要insert到textfile格式的表中再操作。

一、ORC與Parquet總結對比 1、orc不支持嵌套結構(但可通過復雜數據類型如map<k,v>間接實現),parquet支持嵌套結構 2、orc與hive的兼容性強,作為hive的常用存儲格式 3、orc相比parquet的存儲壓縮率較高,如下圖 4、orc導入數據和數據查詢的的速度比parquet快

5.表的行存儲格式(row format)

ROW FORMAT:控制文件數據和hive表中Row數據的轉換,有DELIMITED和SERDE兩種值,可以將ROW FORMAT看做FileFormat的功能支持或實現,我們設置了FileFormat后,底層數據格式的轉換是依賴SerDe來做的。

DELIMITED:表示使用默認的LazySimpleSerDe類來處理數據,一般用于用分隔符分隔的文本文,默認使用native Serde

SERDE:Serde是 Serializer/Deserializer的簡寫。hive使用Serde進行行對象的序列與反序列化。Hive使用SerDe讀取和寫入行對象。讀取就是hdfs文件反序列化成對象,寫入就是對象序列化存儲hdfs

read:HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
write: row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files

一般用于比較復雜格式的文本文件,比如JSON格式行、正則表達式可以匹配出的行,像訪問日志。

 6.表屬性

1.壓縮

1.為什么要壓縮

可以提高吞吐量和性能,大量減少磁盤存儲空間。同時壓縮也會減少文件在磁盤間的傳輸及IO消耗,但是壓縮和截壓縮會帶來額外的CPU開銷,但是可以節省更多的IO消耗和內存使用。

2.壓縮常見的格式
壓縮方式壓縮后大小壓縮速度是否可切分
GZIP
BZIP2
LZO
Snappy
3.壓縮性能比較

壓縮算法 原始文件大小 壓縮文件大小 壓縮速度 解壓速度

gzip 8.3GB 1.8GB 17.5MB/S 58MB/S

bzip2 8.3GB 1.1GB 2.4MB/S 9.5MB/S

lzo 8.3GB 2.9GB 49.3MB/S 74.6MB/S

tblproperties ('orc.compress'='snappy')
tblproperties ('parquet.compression'='snappy');

3)開啟MAP輸出階段壓縮 (1)開啟hive中間傳輸數據壓縮功能

hive (default)>set hive.exec.compress.intermediate=true;

(2)開啟mapreduce中map輸出壓縮功能

hive (default)>set mapreduce.map.output.compress=true;

(3)設置mapreduce中map輸出數據的壓縮方式

hive (default)>set mapreduce.map.output.compress.codec=

org.apache.hadoop.io.compress.SnappyCodec;

4)開啟REDUCE輸出階段壓縮,比map端壓縮事兒多 (1)開啟hive最終輸出數據壓縮功能

hive (default)>set hive.exec.compress.output=true;

(2)開啟mapreduce最終輸出數據壓縮

hive (default)>set mapreduce.output.fileoutputformat.compress=true;

(3)設置mapreduce最終數據輸出壓縮方式

hive (default)> set mapreduce.output.fileoutputformat.compress.codec =

org.apache.hadoop.io.compress.SnappyCodec;

(4)設置mapreduce最終數據輸出壓縮為塊壓縮

hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;

在生產環境中,常用的HIVE存儲格式:列式存儲的orc和parquet

HIVE壓縮格式:冷數據-----gzip壓縮(壓縮比高,壓縮解壓縮速度高,不可切割);

非冷數據------lzo(可切割)和snappy(不可切割)

LZO支持切片,Snappy不支持切片。 ORC和Parquet都是列式存儲。 ORC和Parquet 兩種存儲格式都是不能直接讀取的,一般與壓縮一起使用,可大大節省磁盤空間。 選擇:ORC文件支持Snappy壓縮,但不支持lzo壓縮,所以在實際生產中,使用Parquet存儲 + lzo壓縮的方式更為常見,這種情況下可以避免由于讀取不可分割大文件引發的數據傾斜。 但是,如果數據量并不大(預測不會有超大文件,若干G以上)的情況下,使用ORC存儲,snappy壓縮的效率還是非常高的。

ORC支持三種壓縮:ZLIB,SNAPPY,NONE。最后一種就是不壓縮,orc默認采用的是ZLIB壓縮。

Parquet支持的壓縮:UNCOMPRESSED、 SNAPPY、GZP和LZO,默認UNCOMPRESSED不壓縮

關于“hive常見表結構是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宿迁市| 鄂伦春自治旗| 通辽市| 金塔县| 眉山市| 获嘉县| 长泰县| 高雄市| 威远县| 伊春市| 玉林市| 宣化县| 上饶县| 志丹县| 光山县| 东安县| 龙里县| 平定县| 盐城市| 汕头市| 连州市| 靖边县| 炉霍县| 沽源县| 论坛| 西贡区| 墨玉县| 永登县| 海林市| 唐山市| 介休市| 称多县| 隆德县| 襄樊市| 和林格尔县| 隆昌县| 额尔古纳市| 汽车| 马关县| 诸暨市| 屏山县|