目錄
1、StarRocks 集群管理&配置命令
2、StarRocks 常用操作命令
3、StarRocks 數據導入和導出
1、StarRocks 集群管理&配置命令
查詢 FE 節點信息
SHOW frontends;
SHOW PROC '/frontends';
mysql -h192.168.1.250 -P9030 -uroot -p -e "SHOW PROC '/dbs';"
查詢 BE 節點信息
SHOW backends;
SHOW PROC '/backends';
注意:FE 轉發給 BE 時取的地址是 SHOW BACKENDS 中的 IP,客戶端訪問時,StarRocks 客戶端需要能訪問該地址;
查詢 Broker 節點信息
SHOW broker;
SHOW PROC '/brokers';
注意:兩種查詢方后者 brokers 多一個"s"
-- StarRocks BE 節點管理
-- 添加 BE 節點(到 StarRocks 集群)
-- 注意:host 需要與 priority_networks 相匹配,port 需要與 be.conf 文件中的設置的 heartbeat_service_port 相同,默認為 9050。
ALTER SYSTEM ADD BACKEND "host:port";
ALTER SYSTEM ADD BACKEND "192.168.1.250:9050";
-- 刪除 BE 節點(從 StarRocks 集群)
ALTER SYSTEM decommission BACKEND "host:port";
-- 查看 StarRockets FE 配置項
ADMIN SHOW FRONTEND CONFIG;
ADMIN SHOW FRONTEND CONFIG LIKE '%limit%';
ADMIN SHOW FRONTEND CONFIG LIKE '%bucket%';
-- 修改/配置 FE 動態參數
-- 動態設置的配置項,在 FE 重啟之后會恢復成 fe.conf 文件中的配置或者默認值。如果需要讓配置長期生效,建議設置完之后同時修改 fe.conf 文件,防止重啟后修改失效。
ADMIN SET FRONTEND CONFIG ("key" = "value");
-- 修改/配置 FE 靜態參數
-- FE 靜態參數不支持在線修改,您需要在 fe.conf 中修改并重啟 FE 以使修改生效。
-- FE 靜態參數參考:https://docs.mirrorship.cn/zh/docs/3.1/administration/management/FE_configuration/
-- 查看 BE 配置項
curl http://<BE_IP>:<BE_HTTP_PORT>/varz
curl http://192.168.1.250:8040/varz
-- 修改/配置 BE 動態參數
curl -XPOST http://be_host:http_port/api/update_config?configuration_item=value
-- 修改/配置 BE 靜態參數
-- BE 靜態參數不支持在線修改,您需要在 be.conf 中修改并重啟 BE 服務。
2、StarRocks 常用操作命令
SQL命令官方資料參考:https://docs.mirrorship.cn/zh/docs/2.5/sql-reference/sql-statements/all-commands/
StarRocks的表類型和表操作
StarRocks的表類型:主鍵表、明細表、聚合表、更新表。
主鍵表:
官網介紹參考:https://docs.starrocks.io/zh/docs/table_design/table_types/primary_key_table/
主鍵表使用 StarRocks 全新設計開發的存儲引擎。其主要優勢在于支撐實時數據更新的同時,也能保證高效的復雜即席查詢性能。在實時分析業務中采用主鍵表,用最新的數據實時分析出結果來指導決策,使得數據分析不再受限于 T+1 數據延遲。
主鍵表的使用場景:
場景1:實時對接事務型數據至 StarRocks的場景。
場景2:利用部分列更新輕松實現多流 JOIN。例如畫像場景,采用大寬表方式來提升多維分析的性能,同時簡化數據分析師的使用模型。而這種場景中的上游數據,往往可能來自于多個不同業務(比如來自購物消費業務、快遞業務、銀行業務等)或系統(比如計算用戶不同標簽屬性的機器學習系統),主鍵表的部分列更新功能就很好地滿足這種需求,不同業務直接各自按需更新與業務相關的列即可,并且繼續享受主鍵表的實時同步增刪改數據及高效的查詢性能。
注意:
自 3.0 版本起,主鍵表解耦了排序鍵與主鍵,支持單獨指定排序鍵,提供更靈活的建表能力。
自 3.1 版本起,存算分離模式支持創建主鍵表。
自 3.1.4 版本起,支持持久化主鍵索引至本地磁盤。
自 3.3.2 版本起,支持持久化主鍵索引至對象存儲。
在建表語句中,主鍵列必須定義在其他列之前。
主鍵必須包含分區列和分桶列。
主鍵列支持以下數據類型:數值(包括整型和布爾)、日期和字符串。
默認設置下,單條主鍵值編碼后的最大長度為 128 字節。
建表后不支持修改主鍵。
主鍵列的值不能更新,避免破壞數據一致性。
主鍵表的底層工作原理:
更新表和聚合表整體上采用了 Merge-On-Read 的策略。雖然寫入時處理簡單高效,但是讀取時需要在線 Merge 多個版本的數據文件。并且由于 Merge 算子的存在,謂詞和索引無法下推至底層數據,會嚴重影響查詢性能。
然而為了兼顧實時更新和查詢性能,主鍵表的元數據組織、讀取、寫入方式完全不同。主鍵表采用了 Delete+Insert 策略,借助主鍵索引配合 DelVector 的方式實現,保證在查詢時只需要讀取具有相同主鍵值的數據中的最新數據。如此可以避免 Merge 多個版本的數據文件,并且謂詞和索引可以下推到底層數據,所以可以極大提升查詢性能。
-- 創建表-主鍵表
-- PRIMARY KEY 定義主鍵
-- 主鍵表僅支持分桶策略為哈希分桶,因此您還需要通過 DISTRIBUTED BY HASH () 定義哈希分桶鍵
CREATE TABLE orders1 (
? ? order_id bigint NOT NULL,
? ? dt date NOT NULL,
? ? user_id INT NOT NULL,
? ? good_id INT NOT NULL,
? ? cnt int NOT NULL,
? ? revenue int NOT NULL
)
PRIMARY KEY (order_id)
DISTRIBUTED BY HASH (order_id)
;
eg:
DROP TABLE IF EXISTS test03_pk;
CREATE TABLE IF NOT EXISTS default_catalog.testdb.test03_pk (
? ? id INT,
? ? info STRING,
? ? cnt INT,
? ? uptime DATETIME
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH (id)
;
-- 指定 column_name 部分更新(partialUpdate,StarRocks V3.3.1開始支持 INSERT INTO 指定列時部分更新、低版本不支持仍然為整行更新Full Upset)
INSERT INTO default_catalog.testdb.test03_pk (id,info,cnt,uptime) VALUES (1,'aaa',100,'2024-11-10 08:30:21.111222'),(2,'bbb',102,'2024-11-11 08:35:58.333444');
INSERT INTO default_catalog.testdb.test03_pk (id,info,cnt,uptime) VALUES (3, 'uuu', 103, '2024-11-11 08:35:58.333444');
INSERT INTO default_catalog.testdb.test03_pk (id,info) VALUES (3, 'xxx');
-- 不指定 column_name 整行更新(Full Upset)
INSERT INTO default_catalog.testdb.test03_pk VALUES (3, 'uuu', 103, '2024-11-11 08:35:58.333444');
INSERT INTO default_catalog.testdb.test03_pk VALUES (3, 'uuu', NULL, NULL);
指定 lable:
INSERT INTO default_catalog.testdb.test03_pk WITH LABEL test03_pk_005 (id,info,cnt,uptime) VALUES (1,'aaa',100,'2024-11-10 08:30:21.111222'),(2,'bbb',102,'2024-11-11 08:35:58.333444');
SHOW LOAD WHERE label="test03_pk_005";?
SELECT * FROM default_catalog.testdb.test03_pk;
UPDATE default_catalog.testdb.test03_pk SET info = 'sss' WHERE id=3;
DELETE FROM default_catalog.testdb.test03_pk WHERE id=3;
-- 創建表-主鍵表分區表
-- 如果是主鍵表分區表要求主鍵必須包括分區列和分桶列
-- PRIMARY KEY 指定主鍵。建表后不支持修改主鍵,主鍵列的值不能更新、避免破壞數據一致性
-- PARTITION BY 指定分區列,date_trunc天為粒度(按天分區)
-- DISTRIBUTED BY HASH 定義哈希分桶鍵
-- ORDER BY 指定排序鍵(加速查詢)。建表后支持通過 ALTER TABLE ... ORDER BY ... 修改排序鍵,但不支持刪除排序鍵,不支持修改排序列的數據類型
-- PROPERTIES 屬性,如果建表不指定,SHOW CREATE TABLE example_table\G 查看默認PROPERTIES為:
PROPERTIES (
"replication_num" = "3",
"in_memory" = "false",
"enable_persistent_index" = "false",
"replicated_storage" = "true",
"compression" = "LZ4"
)
CREATE TABLE orders2 (
? ? order_id bigint NOT NULL,
? ? dt date NOT NULL,
? ? merchant_id int NOT NULL,
? ? user_id int NOT NULL,
? ? good_id int NOT NULL,
? ? good_name string NOT NULL,
? ? price int NOT NULL,
? ? cnt int NOT NULL,
? ? revenue int NOT NULL,
? ? state tinyint NOT NULL
)
PRIMARY KEY (order_id,dt,merchant_id)
PARTITION BY date_trunc('day', dt)
DISTRIBUTED BY HASH (merchant_id)
ORDER BY (dt,merchant_id)
PROPERTIES (
? ? "enable_persistent_index" = "true"
);
明細表:
明細表是默認創建的表類型。如果在建表時未指定任何 key,默認創建的是明細表。
建表時支持定義排序鍵。如果查詢的過濾條件包含排序鍵,則 StarRocks 能夠快速地過濾數據,提高查詢效率。
明細表適用于日志數據分析等場景,支持追加新數據,不支持修改歷史數據。
明細表的使用場景:
分析原始數據,例如原始日志、原始操作記錄等。
查詢方式靈活,不需要局限于預聚合的分析方式。
導入日志數據或者時序數據,主要特點是舊數據不會更新,只會追加新的數據。
-- 創建明細表
-- 排序鍵:
-- 自 v3.3.0 起,明細表支持使用 ORDER BY 指定排序鍵,可以是任意列的排列組合。
-- 如果同時使用 ORDER BY 和 DUPLICATE KEY,則 DUPLICATE KEY 無效。
-- 如果未使用 ORDER BY 和 DUPLICATE KEY,則默認選擇表的前三列作為排序鍵。
CREATE TABLE detail (
? ? event_time DATETIME NOT NULL COMMENT "datetime of event",
? ? event_type INT NOT NULL COMMENT "type of event",
? ? user_id INT COMMENT "id of user",
? ? device_code INT COMMENT "device code",
? ? channel INT COMMENT "")
ORDER BY (event_time, event_type);
eg:
DROP TABLE IF EXISTS test02;
CREATE TABLE IF NOT EXISTS test02 (
? ? id INT,
? ? info STRING,
? ? cnt INT,
? ? uptime DATETIME
);
-- 指定排序鍵
CREATE TABLE IF NOT EXISTS test02_b (
? ? id INT,
? ? info STRING,
? ? cnt INT,
? ? uptime DATETIME
)
ORDER BY(id)
;
SHOW CREATE TABLE test02;
SHOW PARTITIONS FROM test02;
SHOW CREATE TABLE test02_b;
SHOW PARTITIONS FROM test02_b;
INSERT INTO default_catalog.testdb.test02 WITH LABEL test02_001 (id,info,cnt,uptime) VALUES (1,'aaa',100,'2024-11-10 08:30:21.111222'),(2,'bbb',102,'2024-11-11 08:35:58.333444');
INSERT OVERWRITE default_catalog.testdb.test02 (id,info,cnt,uptime) VALUES (1,'aaa',100,'2024-11-10 08:30:21.111222'),(2,'bbb',102,'2024-11-11 08:35:58.333444');
select * from default_catalog.testdb.test02;
聚合表:
建表時可以定義聚合鍵并且為 value 列指定聚合函數。當多條數據具有相同的聚合鍵時,value 列會進行聚合。并且支持單獨定義排序鍵,如果查詢的過濾條件包含排序鍵,則 StarRocks 能夠快速地過濾數據,提高查詢效率。
在分析統計和匯總數據時,聚合表能夠減少查詢時所需要處理的數據,提升查詢效率。
使用場景:適用于分析統計和匯總數據。
-- 創建聚合表
-- 建表時必須使用 DISTRIBUTED BY HASH 子句指定分桶鍵。
-- 自 2.5.7 版本起,StarRocks 支持在建表和新增分區時自動設置分桶數量 (BUCKETS),您無需手動設置分桶數量。
-- 在建表語句中,聚合鍵必須定義在其他列之前。
-- 聚合鍵可以通過 AGGREGATE KEY 顯式定義。并且 AGGREGATE KEY 必須包含除 value 列之外的所有列,則建表會失敗。如果不通過 AGGREGATE KEY 顯示定義聚合鍵,則默認除 value 列之外的列均為聚合鍵。
-- 聚合鍵具有唯一性約束。
-- value 列:通過在列名后指定聚合函數,定義該列為 value 列。一般為需要匯總統計的數據。
-- 聚合函數:value 列使用的聚合函數。聚合表支持的聚合函數例如:SUM、MAX、MIN、REPLACE等(詳情參考:https://docs.starrocks.io/zh/docs/sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE/)
-- 排序鍵:自 v3.3.0 起,聚合表解耦了排序鍵和聚合鍵。聚合表支持使用 ORDER BY 指定排序鍵和使用 AGGREGATE KEY 指定聚合鍵。排序鍵和聚合鍵中的列需要保持一致,但是列的順序不需要保持一致。
-- 查詢時,排序鍵在多版聚合之前就能進行過濾,而 value 列的過濾在多版本聚合之后。因此建議將頻繁使用的過濾字段作為排序鍵,在聚合前就能過濾數據,從而提升查詢性能。
-- 建表時,僅支持為 key 列創建 Bitmap 索引、Bloom filter 索引。
CREATE TABLE aggregate_tbl (
? ? site_id LARGEINT NOT NULL COMMENT "id of site",
? ? date DATE NOT NULL COMMENT "time of event",
? ? city_code VARCHAR(20) COMMENT "city_code of user",
? ? pv BIGINT SUM DEFAULT "0" COMMENT "total page views"
)
AGGREGATE KEY(site_id, date, city_code)
DISTRIBUTED BY HASH(site_id);
eg:
DROP TABLE IF EXISTS default_catalog.testdb.test06_aggregate;
CREATE TABLE IF NOT EXISTS default_catalog.testdb.test06_aggregate (
? ? id INT NOT NULL COMMENT "id of city, citiy code",
? ? event VARCHAR(255) COMMENT "event name or desc",
? ? uptime DATETIME NOT NULL COMMENT "time of event",
? ? totalnum BIGINT SUM DEFAULT "0" COMMENT "total num"
)
AGGREGATE KEY(id,event,uptime)
DISTRIBUTED BY HASH(id);
-- DISTRIBUTED BY HASH(id) BUCKETS 4;
-- 注意:
-- 1)建表時必須使用 DISTRIBUTED BY HASH 子句指定分桶鍵。
-- 2)自 2.5.7 版本起,StarRocks 支持在建表和新增分區時自動設置分桶數量 (BUCKETS),您無需手動設置分桶數量。
-- 3)在建表語句中,聚合鍵必須定義在其他列之前。
-- 4)聚合鍵可以通過 AGGREGATE KEY 顯式定義。并且 AGGREGATE KEY 必須包含除 value 列之外的所有列,則建表會失敗。
-- 5)如果不通過 AGGREGATE KEY 顯示定義聚合鍵,則默認除 value 列之外的列均為聚合鍵。
-- 6)聚合鍵具有唯一性約束。
-- 7)通過在列名后指定聚合函數,定義該列為 value 列。一般為需要匯總統計的數據。
-- 8)聚合函數支持:SUM、MAX、MIN、REPLACE,以及其他特殊場景的聚合函數:HLL_UNION、BITMAP_UNION、REPLACE_IF_NOT_NULL。
-- 9)自 v3.3.0 起,聚合表解耦了排序鍵和聚合鍵。聚合表支持使用 ORDER BY 指定排序鍵和使用 AGGREGATE KEY 指定聚合鍵。排序鍵和聚合鍵中的列需要保持一致,但是列的順序不需要保持一致。
-- 10)查詢時,排序鍵在多版聚合之前就能進行過濾,而 value 列的過濾在多版本聚合之后。因此建議將頻繁使用的過濾字段作為排序鍵,在聚合前就能過濾數據,從而提升查詢性能。
SELECT * FROM default_catalog.testdb.test06_aggregate;
INSERT INTO default_catalog.testdb.test06_aggregate (id,event,uptime,totalnum) values (330100,'traffic-hangzhou','2025-01-01 09:30:00', 50000);
INSERT INTO default_catalog.testdb.test06_aggregate (id,event,uptime,totalnum) values (330100,'traffic-hangzhou','2025-01-01 09:30:00', 10000);
INSERT INTO default_catalog.testdb.test06_aggregate (id,event,uptime,totalnum) values (430100,'traffic-changsha','2025-01-01 09:30:00', 30000);
INSERT INTO default_catalog.testdb.test06_aggregate (id,event,uptime,totalnum) values (430100,'traffic-changsha','2025-01-01 09:30:00', 40000);
DELETE FROM default_catalog.testdb.test06_aggregate WHERE id=330100;
TRUNCATE TABLE default_catalog.testdb.test06_aggregate;
-- 注意:
聚合表不支持 UPDATE,例如:
UPDATE default_catalog.testdb.test06_aggregate SET totalnum = 10000 WHERE id=330100;
聚合表不支持無 WHERE 條件的 DELETE,例如:
DELETE FROM default_catalog.testdb.test06_aggregate;
更新表:
建表時需要定義唯一鍵。當多條數據具有相同的唯一鍵時,value 列會進行 REPLACE,查詢時返回唯一鍵相同的一組數據中的最新數據。
并且支持單獨定義排序鍵,如果查詢的過濾條件包含排序鍵,則 StarRocks 能夠快速地過濾數據,提高查詢效率。
更新表能夠支撐實時和頻繁更新的場景,不過目前已經逐漸被主鍵表代替。
適用場景:實時和頻繁更新的業務場景,例如分析電商訂單。在電商場景中,訂單的狀態經常會發生變化,每天的訂單更新量可突破上億。
-- 創建更新表
-- 建表時必須使用 DISTRIBUTED BY HASH 子句指定分桶鍵。
-- 自 2.5.7 版本起,StarRocks 支持在建表和新增分區時自動設置分桶數量 (BUCKETS),您無需手動設置分桶數量。
-- 在建表語句中,唯一鍵必須定義在其他列之前。
-- 唯一鍵需要通過 UNIQUE KEY 顯式定義。
-- 唯一鍵必須滿足唯一性約束。
-- 排序鍵:自 v3.3.0 起,更新表解耦了排序鍵和聚合鍵。更新表支持使用 ORDER BY 指定排序鍵和使用 UNIQUE KEY 指定唯一鍵。排序鍵和唯一鍵中的列需要保持一致,但是列的順序不需要保持一致。
-- 建表時,僅支持為 key 列創建 Bitmap 索引、Bloom filter 索引。
-- 導入數據時,僅支持全部更新,即導入任務需要指明所有列,例如示例中的 create_time、order_id、order_state 和 total_price 四個列。
-- 在設計導入頻率時,建議以滿足業務對實時性的要求為準。查詢更新表的數據時,需要聚合多版本的數據,當版本過多時會導致查詢性能降低。所以導入數據至更新表時,應該適當降低導入頻率,從而提升查詢性能。如果業務對實時性的要求是分鐘級別,那么每分鐘導入一次更新數據即可,不需要秒級導入。
CREATE TABLE orders (
? ? create_time DATE NOT NULL COMMENT "create time of an order",
? ? order_id BIGINT NOT NULL COMMENT "id of an order",
? ? order_state INT COMMENT "state of an order",
? ? total_price BIGINT COMMENT "price of an order"
)
UNIQUE KEY(create_time, order_id)
DISTRIBUTED BY HASH(order_id);?
索引:
https://docs.starrocks.io/zh/docs/category/indexes/
前綴索引和排序鍵:
https://docs.starrocks.io/zh/docs/table_design/indexes/Prefix_index_sort_key/
建表時指定一個或多個列構成排序鍵 (Sort Key)。表中的數據行會根據排序鍵進行排序以后再落入磁盤存儲。
并且數據寫入的過程中會自動生成前綴索引。數據按照指定的排序鍵排序后,每寫入 1024 行數據構成一個邏輯數據塊(Data Block),在前綴索引表中存儲一個索引項,內容為該邏輯數據塊中第一行數據的排序列組成的前綴。
通過這樣兩層的排序結構,查詢時就可以使用二分查找快速跳過不符合條件的數據。
自 3.0 版本起,主鍵表支持使用 ORDER BY 定義排序鍵,自 3.3 版本起,明細表、聚合表和更新表支持使用 ORDER BY 定義排序鍵。
主鍵表中數據先按照主鍵 PRIMARY KEY 進行 REPLACE 后,再按照排序鍵 ORDER BY 排序。
前綴字段的數量不超過 3 個,前綴索引項的最大長度為 36 字節。
由于前綴索引項的最大長度為 36 字節,超過部分會被截斷,因此該表的前綴索引項為 uid (4 字節) + name (只取前 32 字節),前綴字段為 uid 和 name。
前綴字段中 CHAR、VARCHAR、STRING 類型的列只能出現一次,并且處在末尾位置。
Bitmap 索引:
https://docs.starrocks.io/zh/docs/table_design/indexes/Bitmap_index/
Bloom filter 索引:
https://docs.starrocks.io/zh/docs/table_design/indexes/Bloomfilter_index/
[Preview] N-Gram bloom filter 索引:
https://docs.starrocks.io/zh/docs/table_design/indexes/Ngram_Bloom_Filter_Index/
[Preview] 全文倒排索引:
https://docs.starrocks.io/zh/docs/table_design/indexes/inverted_index/
-- 查詢StarRocks數據庫版本號
SELECT current_version() as version;
+---------------+
| version ? ? ? |
+---------------+
| 3.3.2-857dd73 |
+---------------+
1 row in set (0.01 sec)
數據目錄(catalog)
查詢數據目錄列表(catalog)
查看當前集群中的所有 Catalog,包括 Internal Catalog 和 External Catalog
注意:一個 StarRocks 集群中只有一個默認的 internal catalog,名為 default_catalog,不支持刪除;default_catalog 也是 StarRocks 集群中唯一的 internal catalog
SHOW CATALOGS;
SHOW PROC '/catalog';
mysql> show catalogs;
+-----------------------+----------+------------------------------------------------------------------+
| Catalog ? ? ? ? ? ? ? | Type ? ? | Comment ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
+-----------------------+----------+------------------------------------------------------------------+
| default_catalog ? ? ? | Internal | An internal catalog contains this cluster's self-managed tables. |
| jdbc01_mysql_catalog ?| Jdbc ? ? | NULL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| jdbc02_pg_catalog ? ? | Jdbc ? ? | NULL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| jdbc03_oracle_catalog | Jdbc ? ? | NULL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
+-----------------------+----------+------------------------------------------------------------------+
Catalog:Catalog 名稱。
Type:Catalog 類型。如果是 default_catalog,則返回 Internal。如果是 external catalog,則返回 external catalog 的類型,例如 Hive, Hudi, Iceberg。
Comment:Catalog 的備注。
? 1)在創建 external catalog 時不支持為 external catalog 添加備注,所以如果是 external catalog,則返回的 Comment 為 NULL。
? 2)如果是 default_catalog,則默認返回的 Comment 為 An internal catalog contains this cluster's self-managed tables.。default_catalog 是 StarRocks 集群中唯一的 internal catalog,不允許刪除。
注意:
1)只有擁有 External Catalog USAGE 權限的用戶才能查看到該 Catalog。如果沒有該權限,僅返回 default_catalog。您可以使用 GRANT 命令進行授權操作。
2)外部數據目錄不同的類型支持規格不同。
3)StarRocks 的 JDBC 外部數據目錄目前不支持 CREATE TABLE、DROP TABLE、INSERT INTO、TRUNCATE TABLE 操作,主要是支持查詢;
4)Hive 外部數據目錄支持 CREATE TABLE 操作、但也有些操作不支持。
5)外部數據目錄的支持規格和限制,更多詳情可查閱官方資料。
創建外部數據目錄
詳細說明參考官網資料:https://docs.starrocks.io/zh/docs/sql-reference/sql-statements/Catalog/CREATE_EXTERNAL_CATALOG/
該語句用于創建 External Catalog。創建后,無需數據導入或創建外部表即可查詢外部數據:
CREATE EXTERNAL CATALOG [IF NOT EXISTS] <catalog_name>
[COMMENT <comment>]
PROPERTIES ("key"="value", ...)
參數說明:
catalog_name:必須由字母 (a-z 或 A-Z)、數字 (0-9) 或下劃線 (_) 組成,且只能以字母開頭。總長度不能超過 1023 個字符。Catalog 名稱大小寫敏感。
PROPERTIES:External catalog 的屬性,不同的 external catalog 需要設置不同屬性。詳細配置信息,請參見 Hive catalog、Iceberg catalog、Hudi catalog、Delta Lake catalog 和 JDBC Catalog。
-- 創建外部數據目錄示例0(JDBC Catalog)
-- 創建外部數據目錄-創建 jdbc catalog(mysql)
-- driver_url 支持 http[s]、file(file:///<path>/to/the/driver)
DROP CATALOG jdbc01_mysql_catalog
CREATE EXTERNAL CATALOG jdbc01_mysql_catalog
PROPERTIES
(
? ? "type"="jdbc",
? ? "user"="test",
? ? "password"="1q2w3e",
? ? "jdbc_uri"="jdbc:mysql://192.168.1.250:33061",
? ? "driver_url"="https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar",
? ? "driver_class"="com.mysql.cj.jdbc.Driver"
);
如果指定本地的jdbc驅動文件:"driver_url"="file:///home/jdbc_drivers/mysql/mysql-connector-java-8.0.28.jar"
SHOW CATALOGS;
SHOW CREATE CATALOG jdbc01_mysql_catalog;
SHOW DATABASES FROM jdbc01_mysql_catalog;
SHOW TABLES FROM jdbc01_mysql_catalog.testdb;
SELECT * FROM jdbc01_mysql_catalog.testdb.test01;
SHOW CREATE TABLE jdbc01_mysql_catalog.testdb.test01;
-- 創建外部數據目錄-創建 jdbc catalog(postgresql)
-- driver_url 支持 http[s]、file(file:///<path>/to/the/driver)
DROP CATALOG jdbc02_pg_catalog;
CREATE EXTERNAL CATALOG jdbc02_pg_catalog
PROPERTIES
(
? ? "type"="jdbc",
? ? "user"="test",
? ? "password"="1q2w3e",
? ? "jdbc_uri"="jdbc:postgresql://192.168.1.231:5432/testdb",
? ? "driver_url"="https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar",
? ? "driver_class"="org.postgresql.Driver"
);
如果指定本地的jdbc驅動文件:"driver_url"="file:///home/jdbc_drivers/postgresql/postgresql-42.3.3.jar",
注意:
pg 類型的 jdbc catalog 的 jdbc_uri 參數必須指定到 database 級別,否則無法訪問,會報錯:ERROR 1064 (HY000): Driver org.postgresql.Driver claims to not accept jdbcUrl, jdbc:postgresql://x.x.x.x:5432
SHOW CATALOGS;
SHOW CREATE CATALOG jdbc02_pg_catalog;
SELECT * FROM jdbc02_pg_catalog.public.test01;
-- 創建外部數據目錄-創建 jdbc catalog(oracle)
-- driver_url 支持 http[s]、file(file:///<path>/to/the/driver)
DROP CATALOG jdbc03_oracle_catalog;
CREATE EXTERNAL CATALOG jdbc03_oracle_catalog
PROPERTIES
(
? ? "type"="jdbc",
? ? "user"="TEST",
? ? "password"="1q2w3e",
? ? "jdbc_uri"="jdbc:oracle:thin:@192.168.1.140:1521:ORCL",
? ? "driver_url"="https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc10/19.18.0.0/ojdbc10-19.18.0.0.jar",
? ? "driver_class"="oracle.jdbc.driver.OracleDriver"
);
SHOW CATALOGS;
SHOW CREATE CATALOG jdbc02_pg_catalog;
SELECT * FROM jdbc03_oracle_catalog.TEST.TEST01;
JDBC catalog 無論是 mysql、pg、oracle,訪問查詢數據的格式為 catalog.<db|schema|user>.table。
-- 創建外部數據目錄示例(Hive Catalog)
eg:
創建名為 hive_metastore_catalog 的 Hive catalog。其對應的 Hive 集群使用 Hive metastore 作為元數據服務:
CREATE EXTERNAL CATALOG hive_metastore_catalog
PROPERTIES(
? ?"type"="hive",?
? ?"hive.metastore.uris"="thrift://xx.xx.xx.xx:9083"
);
eg:
創建名為 hive_glue_catalog 的 Hive catalog。其對應的 Hive 集群使用 AWS Glue 作為元數據服務:
CREATE EXTERNAL CATALOG hive_glue_catalog
PROPERTIES(
? ? "type"="hive",?
? ? "hive.metastore.type"="glue",
? ? "aws.hive.metastore.glue.aws-access-key"="xxxxxx",
? ? "aws.hive.metastore.glue.aws-secret-key"="xxxxxxxxxxxx",
? ? "aws.hive.metastore.glue.endpoint"="https://glue.x-x-x.amazonaws.com"
);
-- 創建外部數據目錄示例(Iceberg Catalog)
eg:
創建名為 iceberg_metastore_catalog 的 Iceberg catalog。其對應的 Iceberg 集群使用 Hive metastore 作為元數據服務:
CREATE EXTERNAL CATALOG iceberg_metastore_catalog
PROPERTIES(
? ? "type"="iceberg",
? ? "iceberg.catalog.type"="hive",
? ? "iceberg.catalog.hive.metastore.uris"="thrift://xx.xx.xx.xx:9083"
);
eg:
創建名為 iceberg_glue_catalog 的 Iceberg catalog。其對應的 Iceberg 集群使用 AWS Glue 作為元數據服務:
CREATE EXTERNAL CATALOG iceberg_glue_catalog
PROPERTIES(
? ? "type"="iceberg",?
? ? "iceberg.catalog.type"="glue",
? ? "aws.hive.metastore.glue.aws-access-key"="xxxxx",
? ? "aws.hive.metastore.glue.aws-secret-key"="xxx",
? ? "aws.hive.metastore.glue.endpoint"="https://glue.x-x-x.amazonaws.com"
);
-- 創建外部數據目錄示例(hudi Catalog)
eg:
創建名為 hudi_metastore_catalog 的 Hudi catalog。其對應的 Hudi 集群使用 Hive metastore 作為元數據服務:
CREATE EXTERNAL CATALOG hudi_metastore_catalog
PROPERTIES(
? ? "type"="hudi",
? ? "hive.metastore.uris"="thrift://xx.xx.xx.xx:9083"
);
eg:
創建名為 hudi_glue_catalog 的 Hudi catalog。其對應的 Hudi 集群使用 AWS Glue 作為元數據服務:
CREATE EXTERNAL CATALOG hudi_glue_catalog
PROPERTIES(
? ? "type"="hudi",?
? ? "hive.metastore.type"="glue",
? ? "aws.hive.metastore.glue.aws-access-key"="xxxxxx",
? ? "aws.hive.metastore.glue.aws-secret-key"="xxxxxxxxxxxx",
? ? "aws.hive.metastore.glue.endpoint"="https://glue.x-x-x.amazonaws.com"
);
-- 創建外部數據目錄示例(deltalake Catalog)
eg:
創建名為 delta_metastore_catalog 的 Delta Lake catalog。其對應的 Delta Lake 使用 Hive metastore 作為元數據服務:
CREATE EXTERNAL CATALOG delta_metastore_catalog
PROPERTIES(
? ? "type"="deltalake",
? ? "hive.metastore.uris"="thrift://xx.xx.xx.xx:9083"
);
eg:
創建名為 delta_glue_catalog 的 Delta Lake catalog。其對應的 Delta Lake 使用 AWS Glue 作為元數據服務:
CREATE EXTERNAL CATALOG delta_glue_catalog
PROPERTIES(
? ? "type"="deltalake",?
? ? "hive.metastore.type"="glue",
? ? "aws.hive.metastore.glue.aws-access-key"="xxxxxx",
? ? "aws.hive.metastore.glue.aws-secret-key"="xxxxxxxxxxxx",
? ? "aws.hive.metastore.glue.endpoint"="https://glue.x-x-x.amazonaws.com"
);
外部數據目錄授權操作
External catalog 相關的GRANT語法:
GRANT 語法詳細介紹參考:https://docs.starrocks.io/zh/docs/sql-reference/sql-statements/account-management/GRANT/
GRANT
? ?{ USAGE | DROP | ALL [PRIVILEGES] }?
? ?ON { CATALOG <catalog_name> [, <catalog_name>,...] | ALL CATALOGS}
? ?TO { ROLE | USER} {<role_name>|<user_identity>} [ WITH GRANT OPTION ]
查看某個 External Catalog 的創建語句
-- 查看某個 External Catalog 的創建語句(StarRocks 3.0及以上版本支持該命令)
-- 支持查看如下 External Catalog:?
-- Hive Catalog, Iceberg Catalog, Hudi Catalog, Delta Lake Catalog,?
-- JDBC catalog (自 3.0 版本起), Unified Catalog (自 3.2 版本起), MaxCompute Catalog (自 3.3 版本起)
SHOW CREATE CATALOG catalog_name;
SHOW CREATE CATALOG jdbc01_mysql_catalog;
mysql> SHOW CREATE CATALOG jdbc01_mysql_catalog;
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Catalog ? ? ? ? ? ? ?| Create Catalog ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| jdbc01_mysql_catalog | CREATE EXTERNAL CATALOG `jdbc01_mysql_catalog`
PROPERTIES ("driver_class" ?= ?"com.mysql.cj.jdbc.Driver",
"checksum" ?= ?"95cde01c78e7b04e13305338d60e056a",
"driver_url" ?= ?"https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar",
"type" ?= ?"jdbc",
"user" ?= ?"root",
"jdbc_uri" ?= ?"jdbc:mysql://192.168.1.250:33061"
) |
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
當前支持查看如下 External Catalog:
Hive Catalog
Iceberg Catalog
Hudi Catalog
Delta Lake Catalog
JDBC catalog (自 3.0 版本起)
Unified Catalog (自 3.2 版本起)
MaxCompute Catalog (自 3.3 版本起)
其中認證相關的密鑰信息會進行脫敏展示,無法查看。
該命令自 3.0 版本起支持。
切換數據目錄
切換到指定的 Catalog。該命令自 3.0 版本起支持。catalog_name 支持 Internal Catalog 和 External Catalog
SET CATALOG <catalogName>;
SET CATALOG jdbc01_mysql_catalog;
SET CATALOG default_catalog;
-- 刪除數據目錄(catalog)
DROP CATALOG [IF EXISTS] catalog_name
注意:目前不支持刪除 internal catalog。一個 StarRocks 集群中只有一個默認的 internal catalog,名為 default_catalog。
例如:
CREATE EXTERNAL CATALOG hive_metastore
PROPERTIES(
? "type"="hive",?
? "hive.metastore.uris"="thrift://xx.xx.xx.xx:9083"
);
DROP CATALOG hive_metastore;
查詢數據庫列表(SHOW PROC 方式能查詢到更多信息,包括 DbId, DbName, TableNum 等信息)
SHOW databases;
SHOW PROC '/dbs';
SHOW databases FROM <catalog_name>;
SHOW databases FROM default_catalog;
SHOW databases FROM jdbc01_mysql_catalog;
mysql> SHOW databases;
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| _statistics_ ? ? ? |
| information_schema |
| sys ? ? ? ? ? ? ? ?|
| testdb ? ? ? ? ? ? |
+--------------------+
mysql> SHOW PROC '/dbs';
+-------+--------------------+----------+----------------+--------------------------+---------------------+
| DbId ?| DbName ? ? ? ? ? ? | TableNum | Quota ? ? ? ? ?| LastConsistencyCheckTime | ReplicaQuota ? ? ? ?|
+-------+--------------------+----------+----------------+--------------------------+---------------------+
| 1 ? ? | information_schema | 46 ? ? ? | 8388608.000 TB | NULL ? ? ? ? ? ? ? ? ? ? | 9223372036854775807 |
| 100 ? | sys ? ? ? ? ? ? ? ?| 6 ? ? ? ?| 8388608.000 TB | NULL ? ? ? ? ? ? ? ? ? ? | 9223372036854775807 |
| 10002 | _statistics_ ? ? ? | 7 ? ? ? ?| 8388608.000 TB | NULL ? ? ? ? ? ? ? ? ? ? | 9223372036854775807 |
| 10157 | testdb ? ? ? ? ? ? | 3 ? ? ? ?| 8388608.000 TB | NULL ? ? ? ? ? ? ? ? ? ? | 9223372036854775807 |
+-------+--------------------+----------+----------------+--------------------------+---------------------+
-- 切換當前數據庫
USE catalog_name.db_name;
USE default_catalog.testdb;
USE jdbc01_mysql_catalog.testdb;
-- 查詢所有表列表
SHOW TABLES;
SHOW TABLES FROM testdb;
SHOW TABLES FROM default_catalog.testdb;
SHOW TABLES FROM jdbc01_mysql_catalog.testdb;
元數據查詢方式查詢數據庫的表列表:
SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_CATALOG`='def' AND `TABLE_SCHEMA`='testdb';
mysql> SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_CATALOG`='def' AND `TABLE_SCHEMA`='testdb';
+------------------------+
| TABLE_NAME ? ? ? ? ? ? |
+------------------------+
| test02 ? ? ? ? ? ? ? ? |
| performance_test02_dst |
| test01 ? ? ? ? ? ? ? ? |
+------------------------+
3 rows in set (0.01 sec)
注意:
1)內部數據目錄即默認數據目錄(default_catalog)在元數據表 `information_schema`.`TABLES` 中所存儲的 TABLE_CATALOG 字段的值為 def 而不是 ?default_catalog。
2)普通 SQL 命令中需要使用 default_catalog,但如果直接查詢元數據表,則需要使用 def(而不是 default_catalog)。
例如:
INSERT INTO default_catalog.testdb.test01(id,info,cnt,uptime) VALUES (1,'aaa',90,'2025-01-01 13:00:01');
SELECT * FROM default_catalog.testdb.test01;
不指定 catalog 則默認查詢當前 catalog(set catalog 切換數據目錄)
-- 查詢指定數據庫的所有表信息(看到的信息更多,包括 TableId、TableName、PartitionColumnName 等信息)
SHOW PROC '/dbs/<db_id>';
SHOW PROC '/dbs/10157';
mysql> SHOW PROC '/dbs/10157';
+---------+------------------------+----------+---------------------+--------------+--------+------+--------------------------+--------------+---------------+-------------+
| TableId | TableName ? ? ? ? ? ? ?| IndexNum | PartitionColumnName | PartitionNum | State ?| Type | LastConsistencyCheckTime | ReplicaCount | PartitionType | StoragePath |
+---------+------------------------+----------+---------------------+--------------+--------+------+--------------------------+--------------+---------------+-------------+
| 10159 ? | test01 ? ? ? ? ? ? ? ? | 1 ? ? ? ?| ? ? ? ? ? ? ? ? ? ? | 1 ? ? ? ? ? ?| NORMAL | OLAP | NULL ? ? ? ? ? ? ? ? ? ? | 16 ? ? ? ? ? | UNPARTITIONED | NULL ? ? ? ?|
| 10194 ? | test02 ? ? ? ? ? ? ? ? | 1 ? ? ? ?| ? ? ? ? ? ? ? ? ? ? | 1 ? ? ? ? ? ?| NORMAL | OLAP | NULL ? ? ? ? ? ? ? ? ? ? | 1 ? ? ? ? ? ?| UNPARTITIONED | NULL ? ? ? ?|
| 10274 ? | performance_test02_dst | 1 ? ? ? ?| ? ? ? ? ? ? ? ? ? ? | 1 ? ? ? ? ? ?| NORMAL | OLAP | NULL ? ? ? ? ? ? ? ? ? ? | 4 ? ? ? ? ? ?| UNPARTITIONED | NULL ? ? ? ?|
+---------+------------------------+----------+---------------------+--------------+--------+------+--------------------------+--------------+---------------+-------------+
-- 查看表結構:
DESC ?default_catalog.testdb.test01;
-- 元數據表查詢方式查詢表結構:
SELECT `COLUMN_NAME`, `ORDINAL_POSITION`, `COLUMN_KEY`, `DATA_TYPE`, `COLUMN_SIZE`, `DECIMAL_DIGITS`?
? FROM `information_schema`.`COLUMNS`?
? WHERE `TABLE_CATALOG` IS NULL AND `TABLE_SCHEMA`='testdb' AND `TABLE_NAME`='test01';
注意:元數據表 `information_schema`.`COLUMNS` 中的 TABLE_CATALOG 的默認數據目錄記錄的是空值、而不是 def、也不是 default_catalog。
創建表
注意:
1)StarRocks 的 JDBC 外部數據目錄不支持 CREATE TABLE 操作。
2)StarRocks 的建表語法和MySQL的類似,但數據類型、PRIMARY KEY等語法上也有些差異。
3)StarRocks 建表時必須使用 DISTRIBUTED BY HASH 子句指定分桶鍵,分桶數 BUCKETS xx 高版本支持自動設置、可不指定。自 2.5.7 版本起,StarRocks 支持在建表和新增分區時自動設置分桶數量,您無需手動設置分桶數量。
4)分區:分區用于將數據劃分成不同的區間。分區的主要作用是將一張表按照分區鍵拆分成不同的管理單元,針對每一個管理單元選擇相應的存儲策略,比如副本數、分桶數、冷熱策略和存儲介質等。
? ?如果建表沒有指定分區鍵信息的,則StarRocks默認按表名將整個表作為一個分區處理。
? ?PARTITION BY?
? ?分區支持手動創建靜態分區,也支持動態分區。
? ?分區詳細介紹參考官方:https://docs.mirrorship.cn/zh/docs/2.5/table_design/Data_distribution/#%E5%88%86%E5%8C%BA
5)分桶:分區的下一級是分桶,StarRocks 采? Hash 算法作為分桶算法。在同一分區內,分桶鍵哈希值相同的數據形成 Tablet,Tablet 以多副本冗余的形式存儲,是數據均衡和恢復的最小單位。
? ?Tablet 的副本由一個單獨的本地存儲引擎管理,數據導入和查詢最終都下沉到所涉及的 Tablet 副本上。
? 分桶詳細介紹參考官方:https://docs.mirrorship.cn/zh/docs/2.5/table_design/Data_distribution/#%E5%88%86%E5%8C%BA
-- 無主鍵表/明細表
DROP TABLE IF EXISTS testdb.test03;
CREATE TABLE testdb.test03 (
? ? `id` bigint NOT NULL,
? ? `info` string,
? ? `cnt` bigint,
? ? `uptime` datetime
);
INSERT INTO testdb.test03(id,info,cnt,uptime) VALUES (1, 'aaa', 80, '2025-01-01 13:00:01');
INSERT INTO testdb.test03(id,info,cnt,uptime) VALUES (1, 'aaa', 92, '2025-01-02 13:02:20');
INSERT INTO testdb.test03(id,info,cnt,uptime) VALUES (2, 'bbb', 95, '2025-01-03 20:05:30');
SELECT * FROM testdb.test03;
mysql> SELECT * FROM testdb.test03;
+------+------+------+---------------------+
| id ? | info | cnt ?| uptime ? ? ? ? ? ? ?|
+------+------+------+---------------------+
| ? ?1 | aaa ?| ? 80 | 2025-01-01 13:00:01 |
| ? ?1 | aaa ?| ? 92 | 2025-01-02 13:02:20 |
| ? ?2 | bbb ?| ? 95 | 2025-01-03 20:05:30 |
+------+------+------+---------------------+
3 rows in set (0.01 sec)
-- 查詢表的分區(PartitionId,PartitionName)和分桶(Buckets)等信息
SHOW PARTITIONS FROM testdb.test03;
mysql> SHOW PARTITIONS FROM testdb.test03\G;
*************************** 1. row ***************************
? ? ? ? ? ? ?PartitionId: 11286
? ? ? ? ? ?PartitionName: test03
? ? ? ? ? VisibleVersion: 4
? ? ? VisibleVersionTime: 2025-01-09 06:11:24
? ? ? VisibleVersionHash: 0
? ? ? ? ? ? ? ? ? ?State: NORMAL
? ? ? ? ? ? PartitionKey:?
? ? ? ? ? ? ? ? ? ?Range:?
? ? ? ? ?DistributionKey: ALL KEY
? ? ? ? ? ? ? ? ?Buckets: 1
? ? ? ? ? ReplicationNum: 1
? ? ? ? ? ?StorageMedium: HDD
? ? ? ? ? ? CooldownTime: 9999-12-31 15:59:59
LastConsistencyCheckTime: NULL
? ? ? ? ? ? ? ? DataSize: 2.8KB
? ? ? ? ? ? ? IsInMemory: false
? ? ? ? ? ? ? ? RowCount: 3
? ? ? ? ? ? ?DataVersion: 4
? ? ? ? ? ? VersionEpoch: 332537583781281792
? ? ? ? ? VersionTxnType: TXN_NORMAL
1 row in set (0.00 sec)
-- 創建表-主鍵表
DROP TABLE IF EXISTS testdb.test04_pk;
CREATE TABLE testdb.test04_pk (
? ? `id` bigint NOT NULL,
? ? `info` varchar(255),
? ? `cnt` bigint,
? ? `uptime` datetime
) PRIMARY KEY(`id`);
或顯式指定HASH分桶
DROP TABLE IF EXISTS testdb.test04_pk;
CREATE TABLE testdb.test04_pk (
? ? `id` bigint NOT NULL,
? ? `info` varchar(255),
? ? `cnt` bigint,
? ? `uptime` datetime
)?
PRIMARY KEY(`id`)
DISTRIBUTED BY HASH (`id`)
;
-- 查詢表的分區(PartitionId,PartitionName)和分桶(Buckets)等信息
SHOW PARTITIONS FROM testdb.test04_pk;
mysql> SHOW PARTITIONS FROM testdb.test04_pk\G;
*************************** 1. row ***************************
? ? ? ? ? ? ?PartitionId: 11380
? ? ? ? ? ?PartitionName: test04_pk
? ? ? ? ? VisibleVersion: 1
? ? ? VisibleVersionTime: 2025-01-09 09:18:03
? ? ? VisibleVersionHash: 0
? ? ? ? ? ? ? ? ? ?State: NORMAL
? ? ? ? ? ? PartitionKey:?
? ? ? ? ? ? ? ? ? ?Range:?
? ? ? ? ?DistributionKey: id
? ? ? ? ? ? ? ? ?Buckets: 16
? ? ? ? ? ReplicationNum: 1
? ? ? ? ? ?StorageMedium: HDD
? ? ? ? ? ? CooldownTime: 9999-12-31 15:59:59
LastConsistencyCheckTime: NULL
? ? ? ? ? ? ? ? DataSize: 0B
? ? ? ? ? ? ? IsInMemory: false
? ? ? ? ? ? ? ? RowCount: 0
? ? ? ? ? ? ?DataVersion: 1
? ? ? ? ? ? VersionEpoch: 332561087616516096
? ? ? ? ? VersionTxnType: TXN_NORMAL
1 row in set (0.00 sec)
INSERT INTO testdb.test04_pk(id,info,cnt,uptime) VALUES (1, 'aaa', 80, '2025-01-01 13:00:01');
INSERT INTO testdb.test04_pk(id,info,cnt,uptime) VALUES (1, 'aaa', 92, '2025-01-02 13:02:20');
INSERT INTO testdb.test04_pk(id,info,cnt,uptime) VALUES (2, 'bbb', 95, '2025-01-03 20:05:30');
SELECT * FROM testdb.test04_pk;
mysql> SELECT * FROM testdb.test04_pk;
+------+------+------+---------------------+
| id ? | info | cnt ?| uptime ? ? ? ? ? ? ?|
+------+------+------+---------------------+
| ? ?1 | aaa ?| ? 92 | 2025-01-02 13:02:20 |
| ? ?2 | bbb ?| ? 95 | 2025-01-03 20:05:30 |
+------+------+------+---------------------+
2 rows in set (0.00 sec)
-- 創建表-主鍵表分區表(顯式指定 PARTITION BY)
DROP TABLE IF EXISTS testdb.test05_pt;
CREATE TABLE testdb.test05_pt (
? ? `id` bigint NOT NULL,
? ? `uptime` datetime,
? ? `cnt` bigint,
? ? `info` string
)
PRIMARY KEY (id,uptime,cnt)
PARTITION BY date_trunc('day', uptime)
DISTRIBUTED BY HASH (cnt)
ORDER BY (id)
PROPERTIES (
? ? "replication_num" = "1",
? ? "enable_persistent_index" = "true"
);
注意:
1)主鍵必須包含分區列和分桶列。
2)主鍵、分區列、分桶列位置必須放在建表字段的最前面。
3)主鍵 PRIMARY KEY 指定的字段的順序必須是:主鍵,分區列,分桶列的順序。
4)主鍵 PRIMARY KEY 的語法位置和 MySQL 的有區別。
5)如果要顯式指定分桶數,則分桶后面顯式指定 BUCKET xxx,例如:DISTRIBUTED BY HASH (cnt) BUCKETS 4。
6)enable_persistent_index: 持久化索引,可選,如果設置true,會在磁盤上維護一個索引結構,以加速數據查詢,特別是數據量大的時候。重啟時能提供更高效的數據查詢。默認值為false。
? ?注意:
? ?a)如果開啟持久化索引,主鍵模型大大降低了主鍵索引對內存的占用。因為導入時少部分主鍵索引存在內存中,大部分主鍵索引存在磁盤中。單條主鍵編碼后的最大長度為 128 字節。
? ?b)如果不開啟持久化索引,主鍵模型適用于主鍵占用空間相對可控的場景,因為導入時將主鍵索引加載至內存中。單條主鍵編碼后的最大長度和內存占用上限為 128 字節。
7)replication_num:數據的副本數,可選。如果不設置則為默認副本數為3。
? ?StarRocks 中的副本數就是同一個數據分批 Tablet 保存的份數,在建表時通過 replication_num 參數指定,也可以后面修改。默認不指定時,StarRocks使用3副本建表,也即每個 Tablet 會在不同節點存儲三份(StarRocks 的副本策略會將某個 Tablet 的副本存儲在與其不同 IP 的節點)。
? ?注意:
? ?a)副本數必須 <= BE 節點數量。如果只有1個BE節點,則副本數默認為1、也只能設置為1。
? ?b)如果 "replication_num" = "1" 即每個數據分片(Tablet)只有1副本,則不提供數據的副本冗余,無高可靠性。
INSERT INTO testdb.test05_pt(id,info,cnt,uptime) VALUES (1, 'aaa', 80, '2025-01-01 13:00:01');
INSERT INTO testdb.test05_pt(id,info,cnt,uptime) VALUES (1, 'aaa', 92, '2025-01-02 13:02:20');
INSERT INTO testdb.test05_pt(id,info,cnt,uptime) VALUES (2, 'bbb', 95, '2025-01-03 20:05:30');
INSERT INTO testdb.test05_pt(id,info,cnt,uptime) VALUES (2, 'bbb', 95, '2025-01-03 20:05:30');
mysql> SELECT * FROM testdb.test05_pt;
+------+---------------------+------+------+
| id ? | uptime ? ? ? ? ? ? ?| cnt ?| info |
+------+---------------------+------+------+
| ? ?1 | 2025-01-02 13:02:20 | ? 92 | aaa ?|
| ? ?1 | 2025-01-01 13:00:01 | ? 80 | aaa ?|
| ? ?2 | 2025-01-03 20:05:30 | ? 95 | bbb ?|
+------+---------------------+------+------+
3 rows in set (0.01 sec)
-- 查詢表的分區(PartitionId,PartitionName)和分桶(Buckets)等信息
SHOW PARTITIONS FROM testdb.test05_pt;
mysql> SHOW PARTITIONS FROM testdb.test05_pt\G;
*************************** 1. row ***************************
? ? ? ? ? ? ?PartitionId: 11431
? ? ? ? ? ?PartitionName: p20250101
? ? ? ? ? VisibleVersion: 2
? ? ? VisibleVersionTime: 2025-01-09 09:33:06
? ? ? VisibleVersionHash: 0
? ? ? ? ? ? ? ? ? ?State: NORMAL
? ? ? ? ? ? PartitionKey: uptime
? ? ? ? ? ? ? ? ? ?Range: [types: [DATETIME]; keys: [2025-01-01 00:00:00]; ..types: [DATETIME]; keys: [2025-01-02 00:00:00]; )
? ? ? ? ?DistributionKey: cnt
? ? ? ? ? ? ? ? ?Buckets: 2
? ? ? ? ? ReplicationNum: 1
? ? ? ? ? ?StorageMedium: HDD
? ? ? ? ? ? CooldownTime: 9999-12-31 15:59:59
LastConsistencyCheckTime: NULL
? ? ? ? ? ? ? ? DataSize: 955B
? ? ? ? ? ? ? IsInMemory: false
? ? ? ? ? ? ? ? RowCount: 1
? ? ? ? ? ? ?DataVersion: 2
? ? ? ? ? ? VersionEpoch: 332562981307023360
? ? ? ? ? VersionTxnType: TXN_NORMAL
*************************** 2. row ***************************
? ? ? ? ? ? ?PartitionId: 11439
? ? ? ? ? ?PartitionName: p20250102
? ? ? ? ? VisibleVersion: 2
? ? ? VisibleVersionTime: 2025-01-09 09:33:10
? ? ? VisibleVersionHash: 0
? ? ? ? ? ? ? ? ? ?State: NORMAL
? ? ? ? ? ? PartitionKey: uptime
? ? ? ? ? ? ? ? ? ?Range: [types: [DATETIME]; keys: [2025-01-02 00:00:00]; ..types: [DATETIME]; keys: [2025-01-03 00:00:00]; )
? ? ? ? ?DistributionKey: cnt
? ? ? ? ? ? ? ? ?Buckets: 2
? ? ? ? ? ReplicationNum: 1
? ? ? ? ? ?StorageMedium: HDD
? ? ? ? ? ? CooldownTime: 9999-12-31 15:59:59
LastConsistencyCheckTime: NULL
? ? ? ? ? ? ? ? DataSize: 950B
? ? ? ? ? ? ? IsInMemory: false
? ? ? ? ? ? ? ? RowCount: 1
? ? ? ? ? ? ?DataVersion: 2
? ? ? ? ? ? VersionEpoch: 332562989028737024
? ? ? ? ? VersionTxnType: TXN_NORMAL
*************************** 3. row ***************************
? ? ? ? ? ? ?PartitionId: 11447
? ? ? ? ? ?PartitionName: p20250103
? ? ? ? ? VisibleVersion: 3
? ? ? VisibleVersionTime: 2025-01-09 09:34:12
? ? ? VisibleVersionHash: 0
? ? ? ? ? ? ? ? ? ?State: NORMAL
? ? ? ? ? ? PartitionKey: uptime
? ? ? ? ? ? ? ? ? ?Range: [types: [DATETIME]; keys: [2025-01-03 00:00:00]; ..types: [DATETIME]; keys: [2025-01-04 00:00:00]; )
? ? ? ? ?DistributionKey: cnt
? ? ? ? ? ? ? ? ?Buckets: 2
? ? ? ? ? ReplicationNum: 1
? ? ? ? ? ?StorageMedium: HDD
? ? ? ? ? ? CooldownTime: 9999-12-31 15:59:59
LastConsistencyCheckTime: NULL
? ? ? ? ? ? ? ? DataSize: 949B
? ? ? ? ? ? ? IsInMemory: false
? ? ? ? ? ? ? ? RowCount: 1
? ? ? ? ? ? ?DataVersion: 3
? ? ? ? ? ? VersionEpoch: 332562995456507904
? ? ? ? ? VersionTxnType: TXN_NORMAL
3 rows in set (0.00 sec)
-- 查某個表表的創建語句(DDL)
SHOW CREATE TABLE test01;
SHOW CREATE TABLE testdb.test01;
SHOW CREATE TABLE default_catalog.testdb.test01;
mysql> SHOW CREATE TABLE default_catalog.testdb.test01\G;
*************************** 1. row ***************************
? ? ? ?Table: test01
Create Table: CREATE TABLE `test01` (
? `id` int(11) NOT NULL COMMENT "",
? `info` varchar(65533) NULL COMMENT "",
? `cnt` int(11) NULL COMMENT "",
? `uptime` datetime NULL COMMENT ""
) ENGINE=OLAP?
PRIMARY KEY(`id`)
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"compression" = "LZ4",
"enable_persistent_index" = "true",
"fast_schema_evolution" = "true",
"replicated_storage" = "true",
"replication_num" = "1"
);
-- 查詢表的分區(PartitionId,PartitionName)和分桶(Buckets)等信息
SHOW PARTITIONS FROM test01;
SHOW PARTITIONS FROM testdb.test01;
SHOW PARTITIONS FROM default_catalog.testdb.test01;
-- 查看表的子表(tablet)總數:tablet子表總數 = 分區數(partitions) * 分桶數(buckets) * 副本數(replication_num)。非分區表按分區數為1計算。
SHOW tablet FROM test01;
SHOW tablet FROM default_catalog.testdb.test01;
-- 查看自動分桶 & 默認分桶相關配置參數
-- enable_auto_tablet_distribution = true 表示開啟自動分桶功能,建表時未指定分桶數量(例如:BUCKETS 8)時系統也會自動設置分區的分桶數
ADMIN SHOW FRONTEND CONFIG LIKE '%bucket%';
mysql> ADMIN SHOW FRONTEND CONFIG LIKE '%bucket%';
+-------------------------------+------------+------------+---------+-----------+---------+
| Key ? ? ? ? ? ? ? ? ? ? ? ? ? | AliasNames | Value ? ? ?| Type ? ?| IsMutable | Comment |
+-------------------------------+------------+------------+---------+-----------+---------+
| default_automatic_bucket_size | [] ? ? ? ? | 4294967296 | long ? ?| true ? ? ?| ? ? ? ? |
| enable_automatic_bucket ? ? ? | [] ? ? ? ? | true ? ? ? | boolean | true ? ? ?| ? ? ? ? |
| histogram_buckets_size ? ? ? ?| [] ? ? ? ? | 64 ? ? ? ? | long ? ?| true ? ? ?| ? ? ? ? |
+-------------------------------+------------+------------+---------+-----------+---------+
3 rows in set (0.01 sec)
-- 新增分區時,可以手動指定分桶數量,手動修改設置動態分區的默認分桶數(注意:不支持修改已創建分區的分桶數量):
-- 手動創建/新增分區時帶上 BUCKETS num 顯式的指定分桶數量
ALTER TABLE <table_name> ADD PARTITION <partition_name> [DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]];
-- 手動設置表的動態分區的默認分桶數量
ALTER TABLE <table_name> SET ("dynamic_partition.buckets"="xxx");?
-- 查詢表數據量大小(字節)
SELECT concat(round(sum(data_length/1024/1024),2),'MB') AS data_length_MB, concat(round(sum(index_length/1024/1024),2),'MB') AS index_length_MB FROM information_schema.tables WHERE `TABLE_CATALOG`='def' AND table_schema='testdb' AND table_name = 'performance_test02_dst'; ?
SELECT concat(round(sum(data_length/1024/1024),2),'MB') AS data_length_MB, concat(round(sum(index_length/1024/1024),2),'MB') AS index_length_MB FROM information_schema.tables WHERE `TABLE_CATALOG`='def' AND table_schema='testdb' AND table_name = 'test02';
3、StarRocks 數據導入和導出
StarRocks 數據導入
支持多種導入方式:Insert、Stream Load、Broker Load、Pipe、Routine Load、Spark Load。
Insert:
完整的語法參考:https://docs.starrocks.io/zh/docs/sql-reference/sql-statements/loading_unloading/INSERT/
INSERT INTO VALUES:往內部表寫入少量數據。
INSERT INTO SELECT:
1)INSERT INTO SELECT FROM <table_name> :往目標表寫入另外一張表(內部表或外部表)的查詢結果。
2)INSERT INTO SELECT FROM FILES():往目標表寫入遠端存儲的數據文件的查詢結果。該特性自 3.1 版本起支持 AWS S3 數據源,自 3.2 版本起支持 HDFS、Microsoft Azure Storage、Google GCS、及其他兼容 S3 協議的對象存儲(如 MinIO)等數據源。
單次導入數據量限制: 根據內存大小的不同而不同。
INSERT OVERWRITE 覆蓋寫(覆蓋目的表的數據)。
Stream Load:
適用場景: 從本地文件系統批量導入數據。
支持的文件格式: CSV、JSON。
單次導入數據量限制: 10 GB 以內。
Broker Load:
適用場景: 從 HDFS 或 AWS S3、Microsoft Azure Storage、Google GCS、其他兼容 S3 協議的云存儲(如MinIO)、Alibaba Cloud OSS、Tencent Cloud COS、Huawei Cloud OBS 等數據源批量導入數據。從本地文件系統或 NAS 批量導入數據。
支持的文件格式: CSV、Parquet、ORC、JSON(自 3.2.3 版本起支持)。
單次導入數據量限制: 數十到數百 GB。
Pipe:
適用場景: 從 HDFS 或 AWS S3 批量或實時導入數據(該特性自 3.2 版本起支持)。
支持的文件格式: Parquet、ORC。
單次導入數據量限制: 100 GB 到 TB 級別。
Routine Load:
適用場景: 從 Kafka 實時導入數據。
支持的文件格式: CSV、JSON、Avro(自 3.0.1 版本起支持)。
單次導入數據量限制: 微批導入 MB 到 GB 級別。
Spark Load:
適用場景: 通過 Spark 集群從 HDFS 批量導入 Apache Hive? 表的數據。
支持的文件格式: CSV、Parquet(自 2.0 版本起支持)、ORC(自 2.0 版本起支持)。
單次導入數據量限制: 數十 GB 到 TB 級別。
生態工具:
StarRocks Connector for Apache Kafka(簡稱 Kafka Connector)
StarRocks Connector for Apache Spark(簡稱 Spark Connector)
StarRocks Connector for Apache Flink(簡稱 Flink Connector)
以及其他工具(比如 SMT、DataX、CloudCanal、Kettle Connector)
API:
Stream Load transaction interface。Stream Load 事務接口。
適用場景: 從 Apache Flink、Apache Kafka 等外部系統導入數據時,實現跨系統的兩階段(2PC)提交。該特性自 2.4 版本起支持。
支持的文件格式: CSV and JSON。
單次導入數據量限制: 10 GB 以內。
從本地文件系統導入方案:
https://docs.starrocks.io/zh/docs/loading/StreamLoad/
使用 Stream Load 進行batch同步導入。
使用 Broker Load 進行batch異步導入。
StarRocks 提供兩種導入方式幫助您從本地文件系統導入數據:
使用 Stream Load 進行同步導入。
使用 Broker Load 進行異步導入。
兩種導入方式各有優勢:
Stream Load 支持 CSV 和 JSON 兩種數據文件格式,適用于數據文件數量較少且單個文件的大小不超過 10 GB 的場景。
Broker Load 支持 Parquet、ORC、CSV、及 JSON 四種文件格式(JSON 文件格式自 3.2.3 版本起支持),適用于數據文件數量較多且單個文件的大小超過 10 GB 的場景、以及文件存儲在 NAS 的場景。
對于 CSV 格式的數據,需要注意以下兩點:
StarRocks 支持設置長度最大不超過 50 個字節的 UTF-8 編碼字符串作為列分隔符,包括常見的逗號 (,)、Tab 和 Pipe (|)。
空值 (null) 用 \N 表示。比如,數據文件一共有三列,其中某行數據的第一列、第三列數據分別為 a 和 b,第二列沒有數據,則第二列需要用 \N 來表示空值,寫作 a,\N,b,而不是 a,,b。a,,b 表示第二列是一個空字符串。
Stream Load 和 Broker Load 均支持在導入過程中做數據轉換、以及通過 UPSERT 和 DELETE 操作實現數據變更。請參見導入過程中實現數據轉換和通過導入實現數據變更。
本地文件系統 Stream Load 導入
-- Stream Load 導入數據
Stream Load導入詳細介紹可參考官方資料:https://docs.starrocks.io/zh/docs/sql-reference/sql-statements/loading_unloading/STREAM_LOAD/
Stream Load語法:
curl --location-trusted -u <username>:<password> -XPUT <url>
(
? ? data_desc
)
[opt_properties]?
curl StreamLoad 參數說明:
--location-trusted ?
?? ?此參數用于允許 curl 將認證憑據傳輸給任何重定向的 URL。
-u root ?
?? ?用于登錄 StarRocks 的用戶名。指定密碼格式為 -u root:pwd,無密碼格式為 -u root:
data_desc: 用于描述源數據文件,包括源數據文件的名稱、格式、列分隔符、行分隔符、目標分區、以及與 StarRocks 表之間的列對應關系等。data_desc 中的參數可以分為三類:公共參數、CSV 適用的參數、以及 JSON 適用的參數。
opt_properties: 用于指定一些導入相關的可選參數。指定的參數設置作用于整個導入作業。
data_desc & opt_properties 詳細介紹參考官網:https://docs.starrocks.io/zh/docs/sql-reference/sql-statements/loading_unloading/STREAM_LOAD/
-T filename ?
? ? T 代表傳輸(Transfer),用于指定需要傳輸的文件名。
-H 設置 header 參數:
?? ?label:crashdata-0 ?
?? ? ? ?與此 Stream Load 作業關聯的標簽。標簽必須唯一,因此如果多次運行作業,您可以添加一個數字保持遞增。
?? ?where: <condition1>[, <condition2>, ...] 可選參數,用于指定過濾條件。如果指定該參數,StarRocks 會按照指定的過濾條件對轉換后的數據進行過濾。只有符合 WHERE 子句中指定的過濾條件的數據才會導入。
?? ?column_separator:, ?
?? ? ? ?如果導入的文件使用單個 , 作為列分隔符,則設置如上所示。如果使用其他分隔符,則在此處設置該分隔符。常見分隔符包括 \t、, 和 |。
?? ?skip_header:1 ?
?? ? ? ?某些 CSV 文件會在首行(Header)記錄所有的列名,還有些會在第二行記錄所有列的數據類型信息。如果 CSV 文件有一或兩個 Header 行,需要將 skip_header 設置為 1 或 2。如果您使用的 CSV 沒有 Header 行,請將其設置為 0。
?? ?enclose:\" ?
?? ? ? ?如果某些字段包含帶有逗號的字符串,則需要用雙引號括起該字段。本教程使用的示例數據集中,地理位置信息包含逗號,因此需將 enclose 設置為 \",其中 \ 用于轉義 "。
?? ?max_filter_ratio:1 ?
?? ? ? ?導入數據中允許出現錯誤行的比例,范圍 0~1,默認值為 0。理想情況下,應將其設置為 0,即當導入的數據中有任意一行出現錯誤時,導入作業會失敗。本教程中需要將其設置為 1,即在調試過程中,允許所有數據行出現錯誤。
?? ?timeout: 可選參數。用于導入作業的超時時間。取值范圍:1 ~ 259200。單位:秒。默認值:600。除了 timeout 參數可以控制該導入作業的超時時間外,您還可以通過 FE 配置參數 stream_load_default_timeout_second 來統一控制 Stream Load 導入作業的超時時間。如果指定了timeout 參數,則該導入作業的超時時間以 timeout 參數為準;如果沒有指定 timeout 參數,則該導入作業的超時時間以stream_load_default_timeout_second 為準。
?? ?strict_mode:?
?? ? ? ?可選參數。用于指定是否開嚴格模式。取值范圍:true 和 false。默認值:false。true 表示開啟,false 表示關閉。
?? ? ? ?關于該模式的介紹,參見 嚴格模式(https://docs.starrocks.io/zh/docs/loading/load_concept/strict_mode/)
?? ? ? ?如果開啟嚴格模式,StarRocks 會把錯誤的數據行過濾掉,只導入正確的數據行,并返回錯誤數據詳情。
?? ? ? ?如果關閉嚴格模式,StarRocks 會把轉換失敗的錯誤字段轉換成 NULL 值,并把這些包含 NULL 值的錯誤數據行跟正確的數據行一起導入。
?? ? ? ?實際導入過程中,正確的數據行和錯誤的數據行都有可能存在 NULL 值。如果目標列不允許 NULL 值,則 StarRocks 會報錯,并把這些包含 NULL 值的數據行過濾掉。
?? ? ? ?對于 Stream Load、Broker Load、Routine Load 和 Spark Load,導入作業能夠容忍的因數據質量不合格而過濾掉的錯誤數據行所占的最大比例,由作業的可選參數 max_filter_ratio 控制。INSERT 導入方式當前不支持 max_filter_ratio 參數。
?? ? ? ?不同導入方式 strict_mode 默認值不同:?? ? ? ?
?? ? ? ?使用 Stream Load、Broker Load、Routine Load 和 Spark Load 執行數據導入時,需要通過參數 strict_mode 來設置嚴格模式。參數取值范圍:true 和 false。默認值:false。true 表示開啟,false 表示關閉。
?? ? ? ?使用 INSERT 執行數據導入時,需要通過會話變量 enable_insert_strict 來設置嚴格模式。變量取值范圍:true 和 false。默認值:true。true 表示開啟,false 表示關閉。
?? ?columns: ?
?? ? ? ?此參數用于將 CSV 文件中的列映射到 StarRocks 表中的列。當前教程中使用的 CSV 文件中有大量的列,而 StarRocks 表中的列經過裁剪,僅保留部分列。未包含在表中的列在導入過程中都將被跳過。
?? ? ? ?注意:
?? ? ? ?columns 參數支持數據轉換邏輯,在 CSV 文件中經常會有不符合標準的日期和時間,導入時可以指定數據轉換邏輯、將日期和時間數據轉換為 DATETIME 類型的邏輯。
?? ? ? ?例如:如果數據集中的日期是以 MM/DD/YYYY 為格式(CRASH_DATE 列)、時間以 HH:MI 為格式(CRASH_TIME)的2個單獨的列:
?? ? ? ?08/05/2014,9:10,BRONX,10469,40.8733019,-73.8536375,"(40.8733019, -73.8536375)",
?? ? ? ?由于 StarRocks 中的 DATETIME 格式為 YYYY-MM-DD HH:MI:SS,因此需要轉換數據集中的數據,將兩列數據合并成一列、并以空格分隔。則此處 columns: 參數應為:
?? ? ? ?-H "columns:tmp_CRASH_DATE, tmp_CRASH_TIME, CRASH_DATE=str_to_date(concat_ws(' ', tmp_CRASH_DATE, tmp_CRASH_TIME), '%m/%d/%Y %H:%i')
?? ? ? ?說明:
?? ? ? ?通過設置以上參數可實現以下目標:
?? ? ? ?將 CSV 文件的第一列內容分配給 tmp_CRASH_DATE 列;
?? ? ? ?將 CSV 文件的第二列內容分配給 tmp_CRASH_TIME 列;
?? ? ? ?通過 concat_ws() 函數,使用空格將 tmp_CRASH_DATE 列和 tmp_CRASH_TIME 列連接在一起;
?? ? ? ?通過 str_to_date() 函數使用連接后的字符串生成 DATETIME 數據;
?? ? ? ?將生成的 DATETIME 數據存儲在列 CRASH_DATE 中。
? timezone: 可選參數。用于指定導入作業所使用的時區。默認為東八區 (Asia/Shanghai)。該參數的取值會影響所有導入涉及的、跟時區設置有關的函數所返回的結果。受時區影響的函數有 strftime、alignment_timestamp 和 from_unixtime 等,具體請參見設置時區。導入參數 timezone 設置的時區對應“設置時區”中所述的會話級時區。
? load_mem_limit: 可選參數。導入作業的內存限制,最大不超過 BE(或 CN)的內存限制。單位:字節。默認內存限制為 2 GB。
? partial_update: 可選參數。部分更新。是否使用部分列更新。取值包括 TRUE 和 FALSE。默認值:FALSE。
? partial_update_mode: 部分更新模式。
? ?? ?可選參數。指定部分更新的模式,取值包括 row 和 column:
? ?? ?row:默認值,指定使用行模式執行部分更新,比較適用于較多列且小批量的實時更新場景。
? ?? ?column:指定使用列模式執行部分更新,比較適用于少數列并且大量行的批處理更新場景。在該場景,開啟列模式,更新速度更快。例如,在一個包含 100 列的表中,每次更新 10 列(占比 10%)并更新所有行,則開啟列模式,更新性能將提高 10 倍。
? merge_condition: 可選參數。
? ?? ?用于指定作為更新生效條件的列名。這樣只有當導入的數據中該列的值大于等于當前值的時候,更新才會生效。StarRocks v2.5 起支持條件更新。參見通過導入實現數據變更。
? ?? ?詳情參考:https://docs.starrocks.io/zh/docs/loading/Load_to_Primary_Key_tables/
? ?? ?注意:指定的列必須為非主鍵列,且僅主鍵表支持條件更新。
? ?? ?
? ?? ?StarRocks 的主鍵表支持通過 Stream Load、Broker Load 或 Routine Load 導入作業,對 StarRocks 表進行數據變更,包括插入、更新和刪除數據。不支持通過 Spark Load 導入作業或 INSERT 語句對 StarRocks 表進行數據變更。
? ?? ?StarRocks 還支持部分更新 (Partial Update) 和條件更新 (Conditional Update)。
? ?? ?StarRocks 的主鍵表目前支持 UPSERT 和 DELETE 操作,不支持區分 INSERT 和 UPDATE 操作。
? ?? ?在創建導入作業時,StarRocks 支持在導入作業的創建語句或命令中添加 __op 字段,用于指定操作類型。
? ?? ?不同的導入方式,定義 __op 字段的方法也不相同:
?? ? ??? ?如果使用 Stream Load 導入方式,需要通過 columns 參數來定義 __op 字段。
?? ? ??? ?如果使用 Broker Load 導入方式,需要通過 SET 子句來定義 __op 字段。
?? ? ??? ?如果使用 Routine Load 導入方式,需要通過 COLUMNS 參數來定義 __op 字段。
? ?? ?根據要做的數據變更操作,您可以選擇添加或者不添加 __op 字段。不添加 __op 字段的話,默認為 UPSERT 操作。
? ?? ?主要涉及的數據變更操作場景如下:
?? ? ??? ?1)當數據文件只涉及 UPSERT 操作時,可以不添加 __op 字段。
?? ? ??? ?2)當數據文件只涉及 DELETE 操作時,必須添加 __op 字段,并且指定操作類型為 DELETE。
?? ? ??? ?3)當數據文件中同時包含 UPSERT 和 DELETE 操作時,必須添加 __op 字段,并且確保數據文件中包含一個代表操作類型的列,取值為 0 或 1。其中,取值為 0 時代表 UPSERT 操作,取值為 1 時代表 DELETE 操作。
?? ? ?使用說明:
?? ??? ? ?1)必須確保待導入的數據文件中每一行的列數都相同。
?? ??? ? ?2)所更新的列必須包含主鍵列。
? ?? ?
-XPUT: 指定 HTTP 請求方法。必選參數。Stream Load 當前只支持 PUT 方法。
url: 用于指定 StarRocks 表的 URL 地址。必選參數。格式為 ?http://<fe_host>:<fe_http_port>/api/<database_name>/<table_name>/_stream_load
? ? ?您可以通過 SHOW frontends 命令查看 FE 節點的 IP 地址和 HTTP 端口號,例如:mysql -h192.168.1.250 -P9030 -uroot ?-p -e "SHOW frontends;"
mysql -h192.168.1.250 -P9030 -utest -Dtestdb -p -e "TRUNCATE TABLE test01;"
mysql -h192.168.1.250 -P9030 -utest -Dtestdb -p -e "SELECT * FROM test01;"
-- 從本地文件導入數據--UPSET(不指定__op、則默認UPSET)
-- StarRocks 的 Stream Load 導入方式需要使用 curl 命令,涉及許多參數
echo '1,"aaa",100,"2024-11-10 08:30:21.111222"
2,"bbb",102,"2024-11-11 08:35:58.333444"' > test01.csv
curl --location-trusted -u test:1q2w3e \
? ? -T ./test01.csv ? ? ? ? ? ? \
? ? -H "label:test01_001" ? ? ? \
? ? -H "column_separator:," ? ? \
? ? -H "skip_header:0" ? ? ? ? ?\
? ? -H "enclose:\"" ? ? ? ? ? ? \
? ? -H "max_filter_ratio:0" ? ? \
? ? -H "columns:id,info,cnt,uptime" \
? ? -XPUT http://localhost:8030/api/testdb/test01/_stream_load
-- 命令上指定用戶密碼方式: -u user:pwd
-- 命令上指定用戶如果沒有設置密碼,則: -u user:
-- 命令上也可以不指定密碼,等提示輸入再輸入密碼,則:-u user
curl --location-trusted -u test \
? ? -T ./test01.csv ? ? ? ? ? ? \
? ? -H "label:test01_002" ? ? ? \
? ? -H "column_separator:," ? ? \
? ? -H "skip_header:0" ? ? ? ? ?\
? ? -H "enclose:\"" ? ? ? ? ? ? \
? ? -H "max_filter_ratio:0" ? ? \
? ? -H "columns:id,info,cnt,uptime" \
? ? -XPUT http://localhost:8030/api/testdb/test01/_stream_load
-- 導入時也可以不指定 columns(csv文件中的列數要一致):
curl --location-trusted -u test:1q2w3e \
? ? -T ./test01.csv ? ? ? ? ? ? \
? ? -H "label:test01_003" ? ? ? \
? ? -H "column_separator:," ? ? \
? ? -H "skip_header:0" ? ? ? ? ?\
? ? -H "enclose:\"" ? ? ? ? ? ? \
? ? -H "max_filter_ratio:0" ? ? \
? ? -XPUT http://localhost:8030/api/testdb/test01/_stream_load
-- 從本地文件導入數據--DELETE(必須指定__op,僅主鍵表支持DELETE操作,無主鍵表不支持。如果不指定__op則默認為UPSET)
curl --location-trusted -u test:1q2w3e \
? ? -T ./test01.csv ? ? ? ? ? ? \
? ? -H "label:test01_004" ? ? ? \
? ? -H "column_separator:," ? ? \
? ? -H "skip_header:0" ? ? ? ? ?\
? ? -H "enclose:\"" ? ? ? ? ? ? \
? ? -H "max_filter_ratio:0" ? ? \
? ? -H "columns:__op='delete'" ? ? \
? ? -XPUT http://localhost:8030/api/testdb/test01/_stream_load
注意:僅主鍵表支持DELETE操作,如果是非主鍵表,上述命令執行后的效果是追加寫的效果,多次執行,每次都會追加csv文件中的數據到目的表。
-- 如果csv文件數據中同時存在 UPSET 和 DELETE 的數據行,則需要在 csv 文件中包含 __op 字段、填寫對應值(0 代表 UPSET;1 代表 DELETE)
-- 準備數據文件 test01_b.csv,數據中的第一列為臨時列、值為0代表UPSET、1代表DELETE
echo '0,1,"aaa",100,"2024-11-10 08:30:21.111222"
1,2,"bbb",102,"2024-11-11 08:35:58.333444"' > test01_b.csv
查看準備好的csv文件內容:
root@2ce391eef088:/data/deploy/starrocks# cat test01_b.csv?
0,1,"aaa",100,"2024-11-10 08:30:21.111222"
1,2,"bbb",102,"2024-11-11 08:35:58.333444"
-- UPSET 和 DELETE 導入測試
-- 目的表 INSERT 插入數據
mysql -h192.168.1.250 -P9030 -utest -Dtestdb -p -e "INSERT OVERWRITE test01 (id,info,cnt,uptime) VALUES (1,'aaa',100,'2024-11-10 08:30:21.111222'),(2,'bbb',102,'2024-11-11 08:35:58.333444');"
-- 查詢數據
mysql -h192.168.1.250 -P9030 -utest -Dtestdb -p -e "SELECT * FROM test01;"
root@2ce391eef088:/data/deploy/starrocks# mysql -h192.168.1.250 -P9030 -utest -Dtestdb -p -e "SELECT * FROM test01;"?
Enter password:?
+------+------+------+----------------------------+
| id ? | info | cnt ?| uptime ? ? ? ? ? ? ? ? ? ? |
+------+------+------+----------------------------+
| ? ?2 | bbb ?| ?102 | 2024-11-11 08:35:58.333444 |
| ? ?1 | aaa ?| ?100 | 2024-11-10 08:30:21.111222 |
+------+------+------+----------------------------+
-- 執行csv導入(含UPSET和DELETE)
-- -H "columns:xxx" 中指定 __op=opflag 操作列(臨時列opflag),后面指定csv數據文件中對應的數據列:opflag,id,info,cnt,uptime
curl --location-trusted -u test:1q2w3e \
? ? -T ./test01_b.csv ? ? ? ? ? ? \
? ? -H "label:test01_005" ? ? ? \
? ? -H "column_separator:," ? ? \
? ? -H "skip_header:0" ? ? ? ? ?\
? ? -H "enclose:\"" ? ? ? ? ? ? \
? ? -H "max_filter_ratio:0" ? ? \
? ? -H "columns:__op=opflag,opflag,id,info,cnt,uptime" ? ? \
? ? -XPUT http://localhost:8030/api/testdb/test01/_stream_load
-- 執行結果:
root@2ce391eef088:/data/deploy/starrocks# curl --location-trusted -u test:1q2w3e \
> ? ? -T ./test01_b.csv ? ? ? ? ? ? \
> ? ? -H "label:test01_013" ? ? ? \
> ? ? -H "column_separator:," ? ? \
> ? ? -H "skip_header:0" ? ? ? ? ?\
> ? ? -H "enclose:\"" ? ? ? ? ? ? \
> ? ? -H "max_filter_ratio:0" ? ? \
> ? ? -H "columns:__op=opflag,opflag,id,info,cnt,uptime" ? ? \
> ? ? -XPUT http://localhost:8030/api/testdb/test01/_stream_load
{
? ? "TxnId": 149,
? ? "Label": "test01_013",
? ? "Status": "Success",
? ? "Message": "OK",
? ? "NumberTotalRows": 2,
? ? "NumberLoadedRows": 2,
? ? "NumberFilteredRows": 0,
? ? "NumberUnselectedRows": 0,
? ? "LoadBytes": 86,
? ? "LoadTimeMs": 186,
? ? "BeginTxnTimeMs": 0,
? ? "StreamLoadPlanTimeMs": 2,
? ? "ReadDataTimeMs": 0,
? ? "WriteDataTimeMs": 58,
? ? "CommitAndPublishTimeMs": 124
執行后的效果是更新目的表中id=1的行、刪除id=2的行。
starrocks-connector-for-kettle 導入(Stream Load方式):
地址&端口:必填。支持多地址輸入,英文分號分隔,例如:192.168.100.101:8030;192.168.100.102:8030;192.168.100.103:8030;
數據庫名:必填。
user:必填。
pwd:選填。無密碼則不填。
使用的是 StreamLoad 方式,單次導入最大10G;
格式(foramt):必填。StreamLoad格式,支持 CSV、JSON。
列分割符(Column Sepatator):選填。不指定默認為\t;選擇CSV格式時為必填參數;最大長度支持最大不超過 50 個字節的 UTF-8 編碼字符串作為列分隔符;
Json Paths:用于指定待導入的字段的名稱。僅在使用匹配模式導入 JSON 數據時需要指定該參數。
單次導入最大字節數:選填。默認94371840(90M)。數據攢批的大小,達到該閾值后將數據通過 Stream Load 批量寫入 StarRocks。取值范圍:[64MB, 10GB]。
刷新頻率-Scanning Frequency:選填,默認50ms
導入作業最大容錯率-Max Filter Ratio:用于指定導入作業的最大容錯率,即導入作業能夠容忍的因數據質量不合格而過濾掉的數據行所占的最大比例。取值范圍:0~1。默認值:0。
StarRocks連接超時時間-Connect Timeout:
連接 Http-url 的超時時間。選填。取值范圍:[100, 60000]。默認1000。
Stream Load載入數據超時時間-Stream Load Timeout:Stream Load 超時時間,單位為秒。選填。默認600秒。
Stream Load 屬性-Stream Load Properties:可選。Stream Load 的參數,控制導入行為。
部分導入-Partial Update:StarRocks v2.2 起,主鍵模型表支持部分更新,可以選擇只更新部分指定的列。若勾選實現部分導入需要在“部分導入行”中填寫要導入的列名。
部分導入行-Partial Update Columns:需要部分更新的列名。需要填寫所要寫入的目標表中對應的列名。各列名之間要以英文逗號隔開,,例如:col1,col2,col3
是否支持更新和刪除-Enable Upsert Delete:
? StarRocks 目前支持 UPSERT 和 DELETE 操作,不支持一次作業區分UPSERT和DELETE,只能對一次導入單獨實現UPSERT和DELETE。
? UPSERT: 該操作用于插入或更新數據。如果數據已存在(基于主鍵/唯一鍵),它將更新該數據;如果數據不存在,它將插入新數據。
? DELETE: 該操作用于刪除符合條件的數據記錄。需要指定刪除的條件,滿足該條件的所有記錄都將被刪除。
? 目前StarRocks Kettle Connector目前支持UPSERT和DELETE操作,僅支持在一個步驟中使用一種操,不支持一個步驟中同時實現UPSERT和DELETE。在Kettle上游傳輸過來的數據中沒有區分對每條數據進行那種操作的標識,因此不能對一批數據進行分別使用UPSERT或DELETE。若想要進行區分處理,可以嘗試使用Kettle步驟開啟復制多線程將數據分開兩條數據流分別對其進行數據過濾最后通過UPSERT或DELETE將數據導入。
??
Upsert or Delete:當勾選“是否支持更新和刪除”時需要選擇是執行UPSERT或DELETE操作。若未選擇則不執行更新或刪除操作。
表字段-Table field: StarRocks目標表中各列的名稱。需要與流字段一一對應。
流字段-Stream field: 上一步驟傳輸過來的數據列名稱。從上一步驟傳遞的數據列名稱和類型必須與StarRocks目標表的數據格式和大小完全匹配。
條件更新 (Conditional Update):指定更新條件。
Kettle數據類型
String:存儲字符串或文本信息。
Date:存儲日期信息。日期被存儲為從1970-01-01 00:00:00.000 GMT開始的毫秒數。因此,可以保存任何日期和時間,從公元前至公元后。日期類型的默認掩碼為yyyy/MM/dd HH:mm:ss.SSS。
Boolean:存儲邏輯值,即True/False。
Integer:存儲整數值。所有整數都被當作長整型(Long)處理,范圍在-9223372036854775808到9223372036854775807之間。
Number:用于存儲浮點數。這是一種雙精度浮點類型,具有至少15位的精度。
BigNumber:用于存儲任意精度的數字,適合用于精確的科學計算。
Binary:用于存儲二進制對象。
Timestamp:這是一個擴展數據庫的日期類型,允許更好地在數據庫中處理日期和時間的組合。
Internet Address:存儲Internet地址,主要存儲網站的IPV4或IPV6地址。
StarRocks數據類型以及與Kettle對應
Kettle?? ? ? ? ?StarRocks
String?? ? ? ? ?CHAR、STRING、VARCHAR、JSON
Date?? ? ? ? ? ?DATE、DATETIME
Boolean?? ? ? ? ?BOOLEAN
Integer?? ? ? ? ?TINYINT 、SMALLINT 、INT 、BIGINT
Number?? ? ? ? ?DOUBLE、FLOAT
BigNumber?? ? ? ?LARGEINT、DECIMAL
Binary?? ? ? ? ?暫不支持
Timestamp?? ? ? ?DATETIME、DATE
Internet ? ? ?Address?? ?STRING
serializable ?暫不支持
您可以通過 SHOW frontends 命令查看 FE 節點的 IP 地址和 HTTP 端口號。
注意&限制:
必須確保待導入的數據文件中每一行的列數都相同。
所更新的列必須包含主鍵列。
Kettle中暫不支持處理HLL和Bitmap位圖這兩種高級數據結構。
kttle版本盡量使用最近版本,9.3.0.0-349開始更新為Java11.
JDBC地址只用于從fe節點中獲取數據庫表信息,只需添加一個地址即可。
Kettle在進行Check時StarRocks中的largeint會被獲取成UNKNOW,boolean會被映射成tinyint,這兩處錯誤可忽略。
只支持CSV和JSON兩種數據格式:在使用Stream Load向StarRocks導入數據時只采用這兩種數據格式。導入步驟的上游源數據則可是Kettle中的任意數據格式。
StarRocks 數據導出
JDBC SELECT 查詢導出或利用第三方工具(例如:starrocks-connector-for-apache-flink)導出。