日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、概述

在大數(shù)據(jù)處理過程中,Hive是一種非常常用的數(shù)據(jù)倉庫工具。Hive分區(qū)和分桶是優(yōu)化Hive性能的兩種方式,它們的區(qū)別如下:

1、分區(qū)概述

Hive分區(qū)是把數(shù)據(jù)按照某個屬性分成不同的數(shù)據(jù)子集。

  • 在Hive中,數(shù)據(jù)被存儲在HDFS中,每個分區(qū)實(shí)際上對應(yīng)HDFS下的一個文件夾,這個文件夾中保存了這個分區(qū)的數(shù)據(jù)。
  • 因此,在Hive中使用分區(qū),實(shí)際上是將數(shù)據(jù)按照某個屬性值進(jìn)行劃分,然后將相同屬性值的數(shù)據(jù)存儲在同一個文件夾中。Hive分區(qū)的效率提升主要是因為,當(dāng)進(jìn)行查詢操作時,只需讀取與查詢相關(guān)的數(shù)據(jù)分區(qū),避免了全表掃描,節(jié)約了查詢時間

Hive分區(qū)的主要作用是:

  • 提高查詢效率: 使用分區(qū)對數(shù)據(jù)進(jìn)行訪問時,系統(tǒng)只需要讀取和此次查詢相關(guān)的分區(qū),避免了全表掃描,從而顯著提高查詢效率。
  • 降低存儲成本: 分區(qū)可以更加方便的刪除過期數(shù)據(jù),減少不必要的存儲。

2、分桶概述

Hive分桶是將數(shù)據(jù)劃分為若干個存儲文件,并規(guī)定存儲文件的數(shù)量。

  • Hive分桶的實(shí)現(xiàn)原理是將數(shù)據(jù)按照某個字段值分成若干桶,并將相同字段值的數(shù)據(jù)放到同一個桶中。在存儲數(shù)據(jù)時,桶內(nèi)的數(shù)據(jù)會被寫入到對應(yīng)數(shù)量的文件中,最終形成多個文件。
  • Hive分桶主要是為了提高分布式查詢的效率。它能夠通過將數(shù)據(jù)劃分為若干數(shù)據(jù)塊來將大量數(shù)據(jù)分發(fā)到多個節(jié)點(diǎn),使得數(shù)據(jù)均衡分布到多個機(jī)器上處理。這樣分發(fā)到不同節(jié)點(diǎn)的數(shù)據(jù)可以在本地進(jìn)行處理,避免了數(shù)據(jù)的傳輸和網(wǎng)絡(luò)帶寬的浪費(fèi),同時提高了查詢效率。

分桶的主要作用是:

  • 數(shù)據(jù)聚合: 分桶可以使得數(shù)據(jù)被分成較小的存儲單元,提高了數(shù)據(jù)統(tǒng)計和聚合的效率。
  • 均衡負(fù)載: 數(shù)據(jù)經(jīng)過分桶后更容易實(shí)現(xiàn)均衡負(fù)載,數(shù)據(jù)可以分發(fā)到多個節(jié)點(diǎn)中,提高了查詢效率。

綜上所述,分區(qū)和分桶的區(qū)別在于其提供的性能優(yōu)化方向不同。分區(qū)適用于對于數(shù)據(jù)常常進(jìn)行的聚合查詢數(shù)據(jù)分析,而分桶適用于對于數(shù)據(jù)的均衡負(fù)載、高效聚合等方面的性能優(yōu)化。當(dāng)數(shù)據(jù)量較大、查詢效率比較低時,使用分區(qū)和分桶可以有效優(yōu)化性能。分區(qū)主要關(guān)注數(shù)據(jù)的分區(qū)和存儲,而分桶則重點(diǎn)考慮數(shù)據(jù)的分布以及查詢效率。

二、環(huán)境準(zhǔn)備

如果已經(jīng)有了環(huán)境了,可以忽略,如果想快速部署環(huán)境可以參考我這篇文章:通過 Docker-compose 快速部署 Hive 詳細(xì)教程

三、外部表和管理表

在Hive中,可以創(chuàng)建兩種類型的表:外部表和管理表。它們之間的主要區(qū)別如下:

1、外部表

1)外部表介紹

外部表是指在Hive中創(chuàng)建的表,實(shí)際上其數(shù)據(jù)是存儲在外部文件系統(tǒng)(HDFS或本地文件系統(tǒng))中的。

  • 外部分區(qū)表是一種特殊類型的表,它們的數(shù)據(jù)存儲在Hive之外的文件系統(tǒng)上,例如HDFS、S3等。
  • 對于外部分區(qū)表,Hive只會管理它們的元數(shù)據(jù)信息,而不會管理數(shù)據(jù)文件本身,這意味著,如果你使用Hive命令刪除一個外部分區(qū)表,只會刪除該表的元數(shù)據(jù),而不會刪除數(shù)據(jù)文件
  • 外部分區(qū)表通常用于存儲和管理原始數(shù)據(jù),這些數(shù)據(jù)通常需要在多個系統(tǒng)和工具之間共享。

2)示例講解

【示例一】下面是創(chuàng)建Hive外部表的一個示例(數(shù)據(jù)存儲在HDFS):

假設(shè)我們有一個存儲在 HDFS 上的數(shù)據(jù)文件,其路徑為'/user/hive/external_table/data',我們可以通過以下語句,在Hive中創(chuàng)建一個外部表:

# 登錄容器
docker exec -it hive-hiveserver2 
# 登錄hive客戶端
beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop

# 建表
CREATE EXTERNAL TABLE external_table1 (
    column1 STRING,
    column2 INT,
    column3 DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
STORED AS TEXTFILE
LOCATION '/user/hive/external_table/data';

在該表中,我們指定了表的各列的數(shù)據(jù)類型和分隔符等信息,并且使用了LOCATION 關(guān)鍵字來指定數(shù)據(jù)文件的存儲位置。這樣,在Hive中對該外部表進(jìn)行查詢操作時,Hive會自動去對應(yīng)的位置讀取數(shù)據(jù)文件,并據(jù)此返回查詢結(jié)果。

load 數(shù)據(jù)

# 模擬一些數(shù)據(jù)
cat >data<<EOF
c1,12,56.33
c2,14,58.99
c3,15,66.34
c4,16,76.78
EOF

# 登錄hive客戶端
beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop
# 加載數(shù)據(jù),local 是加載本機(jī)文件數(shù)據(jù)
load data local inpath './data' into table external_table1;

需要注意的是,在使用外部表時,我們必須保證Hive對數(shù)據(jù)文件的訪問權(quán)限與HDFS的文件權(quán)限相同,否則會導(dǎo)致外部表的查詢失敗。此外,在使用外部表時,務(wù)必不要刪除外部表的數(shù)據(jù)文件,否則將會導(dǎo)致查詢結(jié)果的不準(zhǔn)確。

【示例一】下面是創(chuàng)建外部表訪問本地數(shù)據(jù)文件的示例(數(shù)據(jù)存儲在本地,很少使用):

在Hive中,我們同樣可以創(chuàng)建外部表來訪問本地文件系統(tǒng)上的數(shù)據(jù)文件。在這種情況下,我們需要注意的是,在Hive的配置中,必須開啟hive.stats.autogather 功能。否則,在查詢外部表時可能會出現(xiàn)錯誤。

假設(shè)我們有一個存儲在本地文件系統(tǒng)上的數(shù)據(jù)文件,路徑為'/path/to/local/file',我們可以通過以下語句,在Hive中創(chuàng)建一個外部表:

CREATE EXTERNAL TABLE external_table2 (
    column1 STRING,
    column2 INT,
    column3 DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
STORED AS TEXTFILE
LOCATION 'file:///path/to/local/file';

### hive文件存儲格式包括以下幾類(STORED AS TEXTFILE):

#1、TEXTFILE

#2、SEQUENCEFILE

#3、RCFILE

#4、ORCFILE(0.11以后出現(xiàn))

#其中TEXTFILE為默認(rèn)格式,建表時不指定默認(rèn)為這個格式,導(dǎo)入數(shù)據(jù)時會直接把數(shù)據(jù)文件拷貝到hdfs上不進(jìn)行處理;

需要注意的是,我們在使用LOCATION關(guān)鍵字時,要指定為'file:///path/to/local/file',而不是 '/path/to/local/file' ,這是因為我們需要使用文件系統(tǒng)的URL來訪問本地文件系統(tǒng)上的數(shù)據(jù)文件。

2、管理表(內(nèi)部表)

1)管理表(內(nèi)部表)介紹

管理表是利用Hive自身的存儲能力來對數(shù)據(jù)進(jìn)行存儲和管理的表。在Hive中創(chuàng)建管理表時,必須指定數(shù)據(jù)的存儲路徑。

  • 管理表也稱為內(nèi)部表(Internal Table),管理表是Hive默認(rèn)創(chuàng)建的表類型,它的數(shù)據(jù)存儲在Hive默認(rèn)的文件系統(tǒng)上(通常是HDFS)。
  • Hive會自動管理這些表的數(shù)據(jù)和元數(shù)據(jù),包括表的位置、數(shù)據(jù)格式等。如果你使用Hive命令刪除了一個管理表,那么該表的數(shù)據(jù)也會被刪除
  • 通常情況下,管理表用于存儲和管理中間結(jié)果、匯總數(shù)據(jù)和基礎(chǔ)數(shù)據(jù)。當(dāng)數(shù)據(jù)規(guī)模較小時,管理表是一個不錯的選擇,因為它可以提供更好的查詢性能,同時也更容易管理。

2)示例講解

在Hive中,除了外部表,我們還可以創(chuàng)建內(nèi)部表來存儲數(shù)據(jù)。與外部表不同的是,內(nèi)部表存儲的數(shù)據(jù)位于Hive自身管理的HDFS上,因此,在創(chuàng)建內(nèi)部表時,我們需要確保數(shù)據(jù)可以被正確地上傳到HDFS上。下面是創(chuàng)建內(nèi)部表并存儲在本機(jī)的示例:

假設(shè)我們有以下數(shù)據(jù)文件,名為data.csv,存儲在本地文件系統(tǒng)的/path/to/local目錄下:

cat >data.csv<<EOF
value1,1,2.3
value2,2,3.4
value3,3,4.5
EOF

我們可以使用以下語句,在Hive中創(chuàng)建一個內(nèi)部表:

CREATE TABLE internal_table (
    column1 STRING,
    column2 INT,
    column3 DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
STORED AS TEXTFILE;

# 加載本地數(shù)據(jù),LOCAL 
LOAD DATA LOCAL INPATH './data.csv' INTO TABLE internal_table;

# 加載HDFS數(shù)據(jù)
# 先將文件推送到HDFS上
hdfs dfs -put ./data.csv /tmp/

# 登錄hive客戶端
beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop
# 加載HDFS上的數(shù)據(jù)
LOAD DATA INPATH '/tmp/data.csv' INTO TABLE internal_table;

# 查詢
select * from internal_table;

 

總之,外部表和管理表都可以在Hive中實(shí)現(xiàn)數(shù)據(jù)的存儲和管理,但它們之間的不同主要體現(xiàn)在數(shù)據(jù)的存儲和處理方式上。

四、分區(qū)表之靜態(tài)分區(qū)和動態(tài)分區(qū)

Hive中的分區(qū)表可以進(jìn)一步細(xì)分為靜態(tài)分區(qū)和動態(tài)分區(qū)。

靜態(tài)分區(qū)是指通過手動指定分區(qū)列的值來創(chuàng)建分區(qū)。例如,在創(chuàng)建一個基于年份的分區(qū)表時,我們可以手動指定每個分區(qū)名對應(yīng)的年份:

CREATE TABLE sales (
  id int,
  date string,
  amount double
)
PARTITIONED BY (year string);

ALTER TABLE sales ADD PARTITION (year='2019') location '/data/sales/2022';
ALTER TABLE sales ADD PARTITION (year='2020') location '/data/sales/2023';

在上述示例中,我們通過 ALTER TABLE 語句手動添加了2019和2020兩個年份的分區(qū)。

動態(tài)分區(qū)是指在加載數(shù)據(jù)時通過SQL語句自動創(chuàng)建分區(qū)。例如,在從一個包含銷售記錄的數(shù)據(jù)文件中加載數(shù)據(jù)時,可以自動根據(jù)數(shù)據(jù)中的年份信息創(chuàng)建相應(yīng)的分區(qū):

INSERT INTO TABLE sales PARTITION (year)
SELECT id, date, amount, YEAR(date)
FROM raw_sales;

在上述示例中,我們使用 PARTITION 子句指定在 CREATE TABLE 語句中定義的分區(qū)列year,并使用 YEAR(date) 表達(dá)式從數(shù)據(jù)中提取出年份信息。

動態(tài)分區(qū)的優(yōu)點(diǎn)在于它可以大大簡化創(chuàng)建和管理分區(qū)表的過程并提高效率;但是需要注意的是,它可能會在某些情況下產(chǎn)生不可預(yù)期的行為,例如可能創(chuàng)建太多分區(qū)。

總之,靜態(tài)分區(qū)和動態(tài)分區(qū)都是用于在Hive中管理大型數(shù)據(jù)集的有效工具,具體使用需要根據(jù)具體情況選擇最適合的方法,并理解它們的優(yōu)點(diǎn)和缺點(diǎn)。

五、hive分區(qū)表嚴(yán)格模式和非嚴(yán)格模式

Hive分區(qū)表的嚴(yán)格模式和非嚴(yán)格模式可以通過以下兩個參數(shù)進(jìn)行設(shè)置:

  1. hive.exec.dynamic.partition.mode:該參數(shù)用于設(shè)置分區(qū)模式,其默認(rèn)值為strict,即嚴(yán)格模式。可以將其設(shè)置為nonstrict,即非嚴(yán)格模式
# 登錄hive客戶端
beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop
# 設(shè)置
SET hive.exec.dynamic.partition.mode=nonstrict;
  1. hive.exec.max.dynamic.partitions:該參數(shù)用于限制動態(tài)分區(qū)的最大數(shù)量。在非嚴(yán)格模式下,當(dāng)動態(tài)分區(qū)的數(shù)量超過該參數(shù)指定的值時,Hive將拋出異常。可以通過以下語句來修改該參數(shù):
SET hive.exec.max.dynamic.partitions=<value>;

其中,<value> 為一個整數(shù)值,表示限制的動態(tài)分區(qū)數(shù)量。如果需要取消該限制,可以將該參數(shù)設(shè)置為一個非正數(shù),例如:

SET hive.exec.max.dynamic.partitions=-1;

需要注意的是,這些參數(shù)的設(shè)置僅對當(dāng)前會話有效,也可以將其添加到Hive的配置文件中以在每個會話中自動應(yīng)用。

總之,hive.exec.dynamic.partition.mode 和 hive.exec.max.dynamic.partitions 是控制Hive分區(qū)表嚴(yán)格模式和非嚴(yán)格模式的兩個重要參數(shù),開發(fā)人員可以根據(jù)自己的需求進(jìn)行設(shè)置。

1)嚴(yán)格模式

嚴(yán)格模式要求在加載數(shù)據(jù)時必須指定所有分區(qū)列的值,否則將會導(dǎo)致拋出異常。例如,在下面的分區(qū)表中:

CREATE TABLE sales (
  id int,
  date string,
  amount double
)
PARTITIONED BY (year string, month string, day string)
CLUSTERED BY (id) INTO 10 BUCKETS;

在嚴(yán)格模式下,我們必須為year、month和day三個分區(qū)列的所有可能取值指定一個分區(qū):

INSERT INTO TABLE sales PARTITION (year='2019', month='01', day='03')
SELECT id, date, amount
FROM raw_sales
WHERE YEAR(date) = 2019 AND MONTH(date) = 1 AND DAY(date) = 3;

在上述示例中,我們使用 PARTITION 子句手動為分區(qū)列year、month、day指定取值。

2)非嚴(yán)格模式

非嚴(yán)格模式則允許忽略某些分區(qū)列的值,這樣使用 INSERT INTO 語句時只需指定提供的分區(qū)值即可。例如:

# 
SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT INTO TABLE sales PARTITION (year, month, day)
SELECT id, YEAR(date), MONTH(date), DAY(date), amount
FROM raw_sales
WHERE YEAR(date) = 2019;

在上述示例中,我們使用 SET 語句設(shè)置分區(qū)模式為非嚴(yán)格模式,然后只提供了year分區(qū)列的值,而month和day分區(qū)列的值是從數(shù)據(jù)中動態(tài)計算得出的。

使用非嚴(yán)格模式可以簡化分區(qū)表的創(chuàng)建和管理,但需要注意,它可能會產(chǎn)生一些意料之外的結(jié)果(例如可能創(chuàng)建太多分區(qū)),所以需要謹(jǐn)慎使用。

總之,分區(qū)表的嚴(yán)格模式和非嚴(yán)格模式都具有一些優(yōu)點(diǎn)和缺點(diǎn),具體使用需要根據(jù)具體情況選擇最適合的方式。

六、分區(qū)表和分桶表示例講解

1)分區(qū)表示例講解

在Hive中,我們可以使用分區(qū)表來更有效地組織和管理數(shù)據(jù)。分區(qū)表將數(shù)據(jù)分為子集,每個子集對應(yīng)一個或多個分區(qū)。這樣,我們就可以更快地訪問和查詢數(shù)據(jù),而不必掃描整個數(shù)據(jù)集。

創(chuàng)建分區(qū)表的語法類似于創(chuàng)建普通表,只不過要使用 PARTITIONED BY 子句指定一個或多個分區(qū)列,例如:

# 內(nèi)部表
CREATE TABLE partitioned_internal_table (
  id INT,
  mesg STRING
)
PARTITIONED BY (
  year INT,
  month INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
STORED AS TEXTFILE;

# 外部表
CREATE EXTERNAL TABLE partitioned_external_table (
  id INT,
  mesg STRING
)
PARTITIONED BY (
  year INT,
  month INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
STORED AS TEXTFILE
LOCATION '/user/hive/partitioned_table/data';

上述語句創(chuàng)建了一個分區(qū)表,在列column1和column2的基礎(chǔ)上,按照year和month兩列進(jìn)行了分區(qū)。

【注意】分區(qū)的實(shí)現(xiàn)依賴于Hive的底層存儲Hadoop分布式文件系統(tǒng)(HDFS)。為了確定如何分配數(shù)據(jù),Hive要求每個分區(qū)對應(yīng)一個目錄,該目錄包含該分區(qū)數(shù)據(jù)的所有文件。因此,在將數(shù)據(jù)加載到分區(qū)表中時,必須提供與分區(qū)對應(yīng)的目錄

例如,如果我們要將一個CSV文件加載到分區(qū)表中,我們可以使用以下語句:

LOAD DATA LOCAL INPATH './file.csv' INTO TABLE partitioned_external_table PARTITION (year=2019, month=1);

# 查看分區(qū)
show partitions partitioned_external_table;

在上述語句中,我們使用 LOAD DATA 子句將 /data/file.csv 文件加載到partitioned_table 表中,并指定了分區(qū)year為2019,分區(qū)month為1。

假設(shè)我們的CSV文件具有以下內(nèi)容:

1,test1,2019,1
1,test2,2019,1
2,test3,2022,1
3,test4,2023,1

使用以下語句查詢分區(qū)表:

SELECT * FROM partitioned_external_table WHERE year=2019 AND month=1;

分區(qū)表的優(yōu)點(diǎn)在于可以更高效地組織數(shù)據(jù),同時也允許我們根據(jù)需要刪除或添加分區(qū)。例如,我們可以使用以下語句刪除分區(qū):

 
ALTER TABLE partitioned_table DROP PARTITION (year=2019, month=1);

可以使用以下語句添加分區(qū):

 
ALTER TABLE partitioned_external_table ADD PARTITION (year=2020, month=2);

# 查看分區(qū)
show partitions partitioned_external_table;

總之,分區(qū)表是管理和查詢大型數(shù)據(jù)集的有效方式,可以幫助我們更輕松地處理大量數(shù)據(jù)。

2)分桶表示例講解

除了分區(qū)表之外,Hive還提供了另一種將數(shù)據(jù)分割成可管理單元的方式,即分桶。

分區(qū)和分桶的概念有一些相似之處,但也存在一些重要的區(qū)別。

  • 分區(qū)是指基于表的某些列將數(shù)據(jù)分割成不同的存儲單元;
  • 而分桶是指將數(shù)據(jù)根據(jù)哈希函數(shù)分成一組固定的桶。

類比于分區(qū),在創(chuàng)建一個分桶表時,我們需要指定分桶的數(shù)量和分桶的列。例如,以下是一個創(chuàng)建分桶表的示例:

CREATE TABLE bucketed_table (
  column1 data_type,
  column2 data_type,
  ...
) 
CLUSTERED BY (column1) -- 分桶列
INTO 10 BUCKETS; -- 桶數(shù)量

在上述示例中,我們將column1作為分桶列,并將數(shù)據(jù)分成10個桶。

加載數(shù)據(jù)時,Hive根據(jù)指定的桶列計算哈希值,并將數(shù)據(jù)存儲在對應(yīng)的桶中。

INSERT INTO TABLE bucketed_table VALUES ('value1', 1, 2.3)

查詢時,可以使用以下格式指定桶列:

SELECT * FROM bucketed_table TABLESAMPLE(BUCKET x OUT OF y ON column1);

在上述示例中,我們使用用于抽樣數(shù)據(jù)的 TABLESAMPLE 子句,指定從桶x中抽取數(shù)據(jù),并在分桶列column1上進(jìn)行抽樣。

分桶表的優(yōu)點(diǎn)在于,我們可以更容易地執(zhí)行等值和范圍查詢,并更好地利用MapReduce 的數(shù)據(jù)本地性,從而提高查詢性能。但分桶表也有一些缺點(diǎn),例如添加和刪除數(shù)據(jù)涉及重新計算哈希函數(shù)和移動數(shù)據(jù)的成本。

總之,分區(qū)表和分桶表都是Hive管理和處理大型數(shù)據(jù)集的重要工具,可以幫助我們更輕松地組織、查詢和分析大量數(shù)據(jù)。在具體使用時,需要考慮表的存儲和查詢需求,選擇最適合的表類型。在實(shí)際場景中分區(qū)用的居多。

分享到:
標(biāo)簽:Hive
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定