1. 程式人生 > >Hive筆記一

Hive筆記一

Hive是一個構建在hadoop上的資料倉庫框架,其目的是讓精通SQL但Java程式設計技能相對較弱的分析師能夠對存放在HDFS中的大規模資料進行執行查詢。

Hive安裝:下載地址:http://hive.apache.org/downloads.html

Hive配置

⑴使用XML配置檔案進行設定,配置檔案為conf目錄下的hive-site.xml,該目錄下還有hive-default.xml配置檔案,其用於記錄Hive使用的選項以及預設值。hive-site.xml檔案適合存放詳細的叢集連線資訊,因為可以使用Hadoop屬性fs.defaultFS和yarn.resourcemanager.address來指定檔案系統和資源管理器,如果沒有這兩個引數,則設為預設值,即使用本地檔案系統和本地作業執行器。

使用--config選項引數給hive命令,來重新定義Hive查詢hive-site.xml檔案的目錄,注意這裡是目錄,而不是具體的xml檔案。

hive --config /xxx/xx/hive-conf

⑵hive 命令傳遞 -hiveconf選項來為單個會話設定屬性,

hive -hiveconf fs.defaultFS=hdfs://localhost 

⑶使用SET命令更改設定,對某個特定的查詢修改Hive設定,也可以使用只帶屬性名的SET命令檢視任何屬性的當前值,不帶引數的SET命令會列出Hive所設定的所有屬性。注意這個列表不包含Hadoop的預設值。

hive >  SET hive.enforce.bucketing=true;

優先順序:4 > 3 > 1 > Hive預設值和預設檔案。

Hive的執行環境:

⑴Hive的shell環境

hive > SHOW TABLES;

⑵非互動模式執行Hive的shell環境

hive -f script.q

⑶當指令碼較短的時候,可使用-e 選項進行內嵌入命令

hive -e 'SELECT * FROM test'

Hive的執行引擎:

Hive的預設的執行引擎是MapReduce,還包括Apache Tez,Spark,可通過屬性hive.execution.engine來控制使用哪種引擎,預設為mp(mapreduce)

Hive的日誌記錄:

可以本地檔案/tmp中找到Hive的錯誤日誌,如果不是,或者希望將日誌目錄指定到別的位置,可以通過命令:

hive -hiveconf hive.log.dir='/xxx'

日誌的配置檔案在conf/hive-log4j.properties中,可通過編輯這個軟體來修改日誌的級別和其他日誌相關的設定。

Hive服務:

Hive的shell環境是服務的一種,在執行時使用--service選項指明要使用哪種服務,輸入 hive --service help可以獲取可用的服務列表。hive的服務有:cli,hiveserver2,beeline,hwi,jar,metastore.

如果一伺服器方式執行hive(hive --service hiveserver2),則可以在應用程式中以不同機制連線到伺服器。Thrift客戶端,JDBC驅動,ODBC驅動方式連線到伺服器。

Metastore:

metastore是Hive元資料的集中存放地,metasotre包括兩部分:服務和後臺資料的儲存。有兩種方式的metastore配置。

⑴內嵌metastore配置:

預設情況,metastore服務和Hive服務執行在同一個JVM中,它包含一個內嵌的以本地磁碟作為儲存的xx資料庫例項,但是,每次只能有一個內嵌xx資料庫可以訪問某個磁碟上的資料庫檔案,即一次只能為每個metastore開啟一個Hive會話。

⑵本地metastore配置:

支援多會話,使用獨立的資料庫,因為metastore服務和Hive服務執行在同一個程序中,但連線的卻是另一個程序中執行的資料庫,在同一臺機器上或在遠端機器上。

HiveQL

Hive的SQL方言,即HiveQL,

Hive支援原子和複雜資料型別,原子資料型別包括數值型,布林型,字串型別和時間戳型別,複雜資料型別包括陣列,對映,結構。

原子型別的命名受MySQL資料型別名稱的影響,但這些資料型別基本對應於Java中的資料型別,BOOLEAN型別用於儲存真值和假值,四種有符號整數型別:TINYINT,SMALLINT,INT,BIGINT,分別等價於Java的byte,short,int,long原子資料型別,分別為1,2,4,8位元組有符號整數。浮點資料型別FLOAT和DOUBLE對應於Java的float和double型別,DECIMAL型別用於表示任意精度的小數,類似Java的BigDecimal型別,常用來表示貨幣值。。。。

複雜型別有ARRAY,MAP,STRUCT,UNION。ARRAY,MAP與Java中同名數據型別相似,STRUCT是一種記錄型別,封裝一個命名的欄位集合,UNION是從幾個資料型別中指明選擇一種,UNION的值必須與這些資料型別之一完全匹配。

函式:

Hive提供很多內建函式,分幾大類,數學和統計函式,字串函式,日期函式,條件函式,聚集函式以及處理XML和JSON的函式。可在shell環境中輸入 SHOW FUNCTIONS來獲取函式列表。可使用DESCRIBE來檢視函式的幫助。

型別轉換:

Hive不會進行反向轉換,回返回錯誤,除非使用CAST操作。

Hive可以進行隱式轉換,即任何數值型別都可以隱式的轉換成一個範圍更廣的型別或者文字型別(STRING,VARCHAR,CHAR).

表:

Hive的表在邏輯上由儲存的資料和描述表中資料形式的相關元資料組成。資料一般存放在HDFS中,當然也可以放在本地檔案系統中。Hive把元資料存放在關係型資料庫中,而不是放在HDFS中。

Hive的表分為兩種型別:一種是內部表,一種是外部表

內部表

Hive預設使用內部表,當載入資料到託管表時,Hive把資料移動到倉庫目錄,例如:

CRETE TABLE table_name(id STRING);

LOAD DATA INPATH ‘/xxx/xxx.txt' INTO table table_name;

這個命令會把xxx.txt檔案移動到table_name的倉庫目錄中。

如果丟棄一個表的話,使用

DROP TABLE table_name;

使用DROP命令,會將它的元資料和資料,一起刪除。

外部表:

建立外部表,Hive需要到倉庫目錄以外的位置訪問資料,控制資料的建立和刪除,外部資料的位置需要在建立表的時候指明:

CREATE EXTERNAL TABLE table_name(id STRING)  LOCATION 'xxx/table_name;

LOCAL DATA INPATH ’/xxx/xxx.txt' INTO TABLE table_name;

外部表的建立可以推遲到建立表之後才執行。當丟棄外部表的時候,Hive不會碰資料,只會刪除元資料。

表的選擇:

如果所有的處理都由Hive完成,則使用託管表;

如果用到Hive和其他工具來處理同一個資料集,則使用外部表。

分割槽和桶:

分割槽和桶都是為了快速的查詢和遍歷資料表。

1.分割槽

當我們使用分割槽時,它會按照分割槽列,將相同的列儲存到同一個分割槽中,一個表可以從多個維度進行分割槽,還可以在原分割槽的基礎上再進行分割槽,即子分割槽。分割槽在建立的時候使用PARTITIONED BY子句定義。

例如:

CREATE TABLE tableName(seq String , name String) PARTITIONED BY( id STRING,country STRING);

當把資料載入到分割槽表的時候,需要顯式指定分割槽值:

LOAD DATA LOCAL INPATH 'xxx/file1' INTO TABLE tablename PARTITION (id=‘xx',country='china');

列出表的分割槽: 使用 SHOW PARTITIONS tablename;

2.桶

一個表可以被劃分到多個桶中,我們使用CLUSTERED BY子句來指定劃分桶所用的列和要劃分的桶的個數:

CREATE TABLE table_name ( id INT,name STRING) CLUSTERED BY (id) INTO 4 BUCKETS;

我們使用id作為劃分桶的標記,Hive對值進行hash並將結果除以桶的個數取餘數,任何一個桶中都會有一個隨機的使用者集合,當然有可能也沒有,當資料很少。

儲存格式

Hive從兩個維度對錶進行儲存管理,分別是行格式,檔案格式,行格式指行和一行中的欄位如何儲存,行格式的定義由SerDe定義,檔案格式指一行中欄位容器的格式,最簡單的格式是純文字檔案,也可以使用面向行和麵向列的二進位制格式。

預設儲存格式為:分隔的文字。如果在建立表時沒有用ROW FORMAT或STORED AS 子句,那麼Hive所使用的預設格式是分隔的文字,每行儲存一個數據行。

 

參考《Hadoop權威指南》