Hive Catalog是一種External Catalog,自2.3版本開始支援。
背景資訊
通過Hive Catalog,您可以:
直接查詢Hive資料,無需手動建表。
使用INSERT INTO或在3.1版本及以上版本中利用非同步物化視圖,對Hive資料進行加工和建模,並匯入到StarRocks。
在StarRocks中建立或刪除Hive資料庫表,或通過INSERT INTO將StarRocks表資料寫入Parquet(自3.2版本起)、ORC或TextFile(自3.3版本起)格式的Hive表中。
為保證正常訪問Hive內的資料,StarRocks叢集必須能夠訪問Hive叢集的儲存系統和中繼資料服務。目前StarRocks支援以下儲存系統和中繼資料服務:
Distributed File System(HDFS)或阿里雲Object Storage Service。
中繼資料服務。當前支援的中繼資料服務包括資料湖構建DLF 1.0(舊版)和Hive Metastore(以下簡稱HMS)。
使用限制
StarRocks查詢Hive內的資料時,支援Parquet、ORC、TextFile、Avro、RCFile、SequenceFile檔案格式,其中:
Parquet檔案支援SNAPPY、LZ4、ZSTD、GZIP和NO_COMPRESSION 壓縮格式。自v3.1.5起,Parquet檔案還支援LZO壓縮格式。
ORC檔案支援ZLIB、SNAPPY、LZO、LZ4、ZSTD和NO_COMPRESSION壓縮格式。
TextFile檔案從v3.1.5起支援LZO壓縮格式。
StarRocks查詢Hive內的資料時,不支援INTERVAL、BINARY和UNION三種資料類型。此外,對於TextFile格式的Hive表,StarRocks不支援MAP、STRUCT資料類型。
StarRocks寫入資料到Hive時,支援Parquet(3.2版本及以上)、以及ORC或TextFile(3.3版本及以上)檔案格式,其中:
Parquet和ORC檔案支援NO_COMPRESSION、SNAPPY、LZ4、ZSTD和GZIP壓縮格式。
TextFile檔案支援NO_COMPRESSION壓縮格式。
您可以通過系統變數
connector_sink_compression_codec來設定寫入到Hive表時的壓縮演算法。
建立Hive Catalog
文法
CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES
(
"type" = "hive",
GeneralParams,
MetastoreParams
)參數說明
Hive使用的中繼資料服務不同,參數的配置也不同。
使用HMS
catalog_name:Hive Catalog的名稱,必選參數。命名要求如下:必須由字母(a~z或A~Z)、數字(0~9)或底線(_)組成,並且只能以字母開頭。
總長度不能超過64個字元。
comment:Hive Catalog的描述。此參數為可選。type:資料來源的類型。設定為hive。GeneralParams:指定通用設定的一組參數。GeneralParams包含如下參數。參數
是否必須
說明
enable_recursive_listing
否
指定StarRocks是否遞迴讀取表或者分區目錄(包括子目錄)中檔案的資料。取值範圍:
true(預設值):表示遞迴遍曆。
false:表示唯讀取表或者分區目錄當前層級中檔案的資料。
MetastoreParams:StarRocks訪問Hive叢集中繼資料的相關參數配置。屬性
說明
hive.metastore.type
配置MetaStore類型,預設為空白,表示使用Hive MetaStore的中繼資料。
hive.metastore.uris
Hive MetaStore的URI。格式為
thrift://<Hive MetaStore的IP地址>:<連接埠號碼>,連接埠號碼預設為9083。
使用DLF 1.0(舊版)
catalog_name:Hive Catalog的名稱,必選參數。命名要求如下:必須由字母(a~z或A~Z)、數字(0~9)或底線(_)組成,並且只能以字母開頭。
總長度不能超過64個字元。
comment:Hive Catalog的描述。此參數為可選。type:資料來源的類型。設定為hive。GeneralParams:指定通用設定的一組參數。GeneralParams包含如下參數。參數
是否必須
說明
enable_recursive_listing
否
指定StarRocks是否遞迴讀取表或者分區目錄(包括子目錄)中檔案的資料。取值範圍:
true(預設值):表示遞迴遍曆。
false:表示唯讀取表或者分區目錄當前層級中檔案的資料。
MetastoreParams:StarRocks訪問Hive叢集中繼資料的相關參數配置。屬性
說明
hive.metastore.type
Hive使用的中繼資料類型,設定為
dlf。dlf.catalog.id
DLF 1.0中已有的資料目錄ID。僅當
hive.metastore.type配置為dlf時需要填寫該參數。如果未配置dlf.catalog.id參數的值,則系統將使用預設的DLF Catalog。
樣本
以下樣本使用HDFS作為儲存,建立了一個名為hive_catalog的Hive Catalog。
使用HMS
CREATE EXTERNAL CATALOG hive_catalog
PROPERTIES
(
"type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);使用DLF 1.0(舊版)
CREATE EXTERNAL CATALOG hive_catalog
PROPERTIES
(
"type" = "hive",
"hive.metastore.type" = "dlf",
"dlf.catalog.id" = "sr_dlf"
);查看Hive Catalog
您可以通過SHOW CATALOGS查詢當前所在StarRocks裡所有Catalog。
SHOW CATALOGS;您也可以通過SHOW CREATE CATALOG查詢某個External Catalog的建立語句。例如,通過如下命令查詢Hive Cataloghive_catalog的建立語句。
SHOW CREATE CATALOG hive_catalog;切換Hive Catalog和資料庫
您可以通過如下方法切換至目標Hive Catalog和資料庫:
先通過
SET CATALOG指定當前會話生效的Hive Catalog,然後再通過USE指定資料庫。-- 切換當前會話生效的Catalog。 SET CATALOG <catalog_name>; -- 指定當前會話生效的資料庫。 USE <db_name>;通過USE直接將會話切換到目標Hive Catalog下的指定資料庫。
USE <catalog_name>.<db_name>;
刪除Hive Catalog
您可以通過DROP CATALOG刪除某個External Catalog。
例如,通過以下命令刪除hive_catalog。
DROP Catalog hive_catalog;建立Hive資料庫
與StarRocks內部資料目錄(Internal Catalog)一致,如果您擁有Hive Catalog的CREATE DATABASE許可權,則可以通過使用CREATE DATABASE語句在該Hive Catalog內建立資料庫。本功能自3.2版本起開始支援。
您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。
文法
切換至目標Hive Catalog,然後通過以下語句建立Hive資料庫。
CREATE DATABASE <database_name>
[PROPERTIES ("location" = "<prefix>://<path_to_database>/<database_name.db>")]參數說明
如果您在建立資料庫時不指定location,那麼系統會使用預設的<warehouse_location>/<database_name.db>作為檔案路徑。
location參數用於指定資料庫所在的檔案路徑,支援HDFS和Object Storage Service:
HDFS:
Prefix取值為hdfs。阿里雲OSS或OSS-HDFS:取值為
oss。
刪除Hive資料庫
同StarRocks內部資料庫一致,如果您擁有Hive資料庫的DROP許可權,那麼您可以使用DROP DATABASE來刪除該Hive資料庫。本功能自3.2版本起開始支援。僅支援刪除空資料庫。
您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。
刪除資料庫操作並不會將HDFS或Object Storage Service上的對應檔案路徑刪除。
切換至目標Hive Catalog,然後通過以下語句刪除 Hive 資料庫。
DROP DATABASE <database_name>;建立Hive表
同StarRocks內部資料庫一致,如果您擁有Hive資料庫的CREATE TABLE許可權,那麼您可以使用CREATE TABLE、CREATE TABLE AS SELECT (CTAS)、或[CREATE TABLE LIKE](../../sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE_LIKE.md),在該Hive資料庫下建立Managed Table。
本功能自3.2版本起開始支援,彼時只支援建立Parquet格式的Hive表。自3.3版本起,該功能還支援建立ORC及TextFile格式的Hive表。
切換至目標Hive Catalog和資料庫,然後通過以下語句建立Hive的 Managed Table。
文法
CREATE TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...
partition_column_definition1,partition_column_definition2...])
[partition_desc]
[PROPERTIES ("key" = "value", ...)]
[AS SELECT query]
[LIKE [database.]<source_table_name>]參數說明
column_definition
column_definition文法定義如下所示。col_name col_type [COMMENT 'comment']涉及參數說明如下表所示。
參數
說明
col_name列名稱。
col_type列資料類型。
當前支援如下資料類型:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、DATE、DATETIME、CHAR、VARCHAR[(length)]、ARRAY、MAP、STRUCT。
不支援LARGEINT、HLL、BITMAP類型。
說明所有非分區列的預設值均為
NULL(即,在建表語句中指定DEFAULT "NULL")。分區列必須在最後聲明,且不能為NULL。partition_desc
partition_desc文法定義如下所示。PARTITION BY (par_col1[, par_col2...])目前StarRocks僅支援Identity Transforms。 即為每個唯一的分區值建立一個分區。
說明分區列必須在最後聲明,支援除FLOAT、DOUBLE、DECIMAL、DATETIME以外的資料類型,並且不支援NULL值。此外,partition_desc中聲明的分區列的順序必須與column_definition中定義的列的順序一致。
PROPERTIES
可以在
PROPERTIES中通過"key" = "value"的形式聲明Hive表的屬性。以下列出幾個常見的屬性。屬性
描述
location
Managed Table所在的檔案路徑。使用HMS作為中繼資料服務時,您無需指定
location參數。file_format
Managed Table的檔案格式。當前支援Parquet、ORC、TextFile檔案格式,其中ORC和TextFile檔案格式自3.3版本起支援。取值範圍:
parquet、orc、textfile。預設值:parquet。compression_codec
Managed Table的壓縮格式。該屬性自3.2.3版本起棄用,此後寫入Hive表時的壓縮演算法統一由會話變數connector_sink_compression_codec控制。
樣本
以下建表語句以預設的 Parquet 格式為例。
建立非分區表
unpartition_tbl,包含id和score兩列。CREATE TABLE unpartition_tbl ( id int, score double );建立分區表
partition_tbl_1,包含action、id、dt三列,並定義id和dt為分區列。CREATE TABLE partition_tbl_1 ( action varchar(20), id int NOT NULL, dt date NOT NULL ) PARTITION BY (id,dt);查詢原表
partition_tbl_1的資料,並根據查詢結果建立分區表partition_tbl_2,定義id和dt為partition_tbl_2的分區列:CREATE TABLE partition_tbl_2 PARTITION BY (id, dt) AS SELECT * from partition_tbl_1;
查看Hive表結構
您可以通過如下方法查看Hive表的表結構:
查看錶結構
DESC[RIBE] <catalog_name>.<database_name>.<table_name>;從CREATE命令查看錶結構和表檔案存放位置
SHOW CREATE TABLE <catalog_name>.<database_name>.<table_name>;
查看Hive表資料
方式一:直接查詢表資料
SELECT * FROM <catalog_name>.<database_name>.<table_name>;方式二:逐步查看與查詢
查看指定Catalog所屬的Hive叢集中的資料庫。
SHOW DATABASES FROM <catalog_name>;查詢目標表的資料。
SELECT count(*) FROM <table_name> LIMIT 10;
匯入Hive資料
假設有一個OLAP表,表名為olap_tbl。您可以通過以下方式轉換該表中的資料,並將資料匯入到StarRocks中。
INSERT INTO default_catalog.olap_db.olap_tbl SELECT * FROM hive_table;賦予Hive表和視圖的許可權
您可以通過GRANT來賦予角色某個Hive Catalog內所有表和視圖的查詢許可權。命令文法如下所示。
GRANT SELECT ON ALL TABLES IN ALL DATABASES TO ROLE <role_name>例如,通過如下命令建立角色hive_role_table,切換至 Hive Cataloghive_catalog,然後把hive_catalog內所有表和視圖的查詢許可權都賦予hive_role_table。
-- 建立角色 hive_role_table。
CREATE ROLE hive_role_table;
-- 切換到資料目錄 hive_catalog。
SET CATALOG hive_catalog;
-- 把hive_catalog內所有表和視圖的查詢許可權賦予hive_role_table。
GRANT SELECT ON ALL TABLES IN ALL DATABASES TO ROLE hive_role_table;向Hive表中插入資料
同StarRocks內表一致,如果您擁有Hive表(Managed Table或External Table)的INSERT許可權,那麼您可以使用INSERT將StarRocks表資料寫入到該Hive表中。
本功能自3.2版本起開始支援,彼時只支援寫入到Parquet格式的Hive表。自3.3版本起,該功能還支援寫入到ORC及TextFile格式的Hive表。
需要注意的是,寫資料到External Table的功能預設是關閉的,您需要通過系統變數ENABLE_WRITE_HIVE_EXTERNAL_TABLE開啟。
您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。
您可以通過會話變數connector_sink_compression_codec來指定寫入Hive表時的壓縮演算法。
切換至目標Hive Catalog和資料庫,然後通過如下文法將StarRocks表資料寫入到Parquet格式的Hive表中。
文法
INSERT {INTO | OVERWRITE} <table_name>
[ (column_name [, ...]) ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
-- 向指定分區寫入資料。
INSERT {INTO | OVERWRITE} <table_name>
PARTITION (par_col1=<value> [, par_col2=<value>...])
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }分區列不允許為NULL,因此匯入時需要保證分區列有值。
參數說明
參數 | 說明 |
INTO | 將資料追加寫入目標表。 |
OVERWRITE | 將資料覆蓋寫入目標表。 |
column_name | 匯入的目標列。可以指定一個或多個列。指定多個列時,必須用逗號 ( |
expression | 運算式,用以為對應列賦值。 |
DEFAULT | 為對應列賦予預設值。 |
query | 查詢語句,查詢的結果會匯入至目標表中。查詢語句支援任意StarRocks支援的SQL查詢文法。 |
PARTITION | 匯入的目標資料分割。需要指定目標表的所有分區列,指定的分區列的順序可以與建表時定義的分區列的順序不一致。指定分區時,不允許通過列名 ( |
樣本
以下寫入語句以預設的Parquet格式為例。
向表
partition_tbl_1中插入如下三行資料。INSERT INTO partition_tbl_1 VALUES("buy", 1, "2023-09-01"),("sell", 2, "2023-09-02"),("buy", 3, "2023-09-03");向表
partition_tbl_1按指定列順序插入一個包含簡單計算的SELECT查詢的結果資料。INSERT INTO partition_tbl_1 (id, action, dt) SELECT 1+1, 'buy', '2023-09-03';向表
partition_tbl_1中插入一個從其自身讀取資料的SELECT查詢的結果。INSERT INTO partition_tbl_1 SELECT 'buy', 1, date_add(dt, INTERVAL 2 DAY)FROM partition_tbl_1WHERE id=1;向表
partition_tbl_2中dt='2023-09-01'、id=1的分區插入一個 SELECT 查詢的結果資料。方式1
INSERT INTO partition_tbl_2 SELECT 'order', 1, '2023-09-01';方式2
INSERT INTO partition_tbl_2 partition(dt='2023-09-01',id=1) SELECT 'order';
將表
partition_tbl_1中dt='2023-09-01'、id=1的分區下所有action列值全部覆蓋為close:方式1
INSERT OVERWRITE partition_tbl_1 SELECT 'close', 1, '2023-09-01';方式2
INSERT OVERWRITE partition_tbl_1 partition(dt='2023-09-01',id=1) SELECT 'close';
刪除Hive表
同StarRocks內表一致,如果您擁有Hive表的DROP許可權,那麼您可以使用DROP TABLE來刪除該Hive表。本功能自3.2版本起開始支援。注意當前只支援刪除Hive的Managed Table。
您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。
執行刪除表的操作時,您必須在DROP TABLE語句中指定FORCE關鍵字。該操作不會刪除表對應的檔案路徑,但是會刪除HDFS或Object Storage Service上的表資料。請您謹慎執行該操作。
切換至目標Hive Catalog和資料庫,然後通過以下語句刪除Hive表。
DROP TABLE <table_name> FORCE手動或自動更新中繼資料快取
StarRocks預設會緩衝Hive的中繼資料,並以非同步模式自動更新這些緩衝,以提升查詢效能。如果對Hive表進行結構變更或其他更新,您可以使用以下命令手動更新該表的中繼資料,以確保StarRocks能及時產生高效的查詢計劃。
REFRESH EXTERNAL TABLE <table_name> [PARTITION ('partition_name', ...)]以下情況適合執行手動更新中繼資料:
已有分區內的資料檔案發生變更,例如執行過
INSERT OVERWRITE ... PARTITION ...命令。Hive表的Schema發生變更。
Hive表被DROP後重建一個同名Hive表。
建立Hive Catalog時在
PROPERTIES中指定"enable_cache_list_names" = "true",此時在Hive側新增分區後,需要查詢這些新增分區。
自2.5.5版本起,StarRocks支援周期性重新整理Hive中繼資料快取。開啟此功能後,預設每10分鐘將自動重新整理Hive中繼資料快取,這樣在大部分情況下,您無需執行手動更新。只有在新增分區後並需要立即查詢這些資料時,才需手動更新。
REFRESH EXTERNAL TABLE只會更新FE中已緩衝的表和分區。
相關文檔
Hive更多介紹,請參見Hive概述。