一.分区表创建(2种方式):
目前仅支持分区键的数据类型为日期和整数类型。
1. 手动创建指定分区
CREATE TABLE OL_TABLE_SR
(
STATIC_DATE DATE COMMENT '统计日期' ,
DT BIGINT COMMENT '该时间全量数据'
) ENGINE=OLAP
DUPLICATE KEY(STATIC_DATE, STATIC_YEAR,STATIC_MONTH)
PARTITION BY RANGE(DT)
(
PARTITION p20030101 VALUES [("20030101"), ("20030102")),
PARTITION p20120101 VALUES [("20120101"), ("20120102")),
PARTITION p20150101 VALUES [("20150101"), ("20150102")),
PARTITION p20150102 VALUES [("20150102"), ("20150103")),
PARTITION p20150103 VALUES [("20150103"), ("20150104")),
PARTITION p20150104 VALUES [("20150104"), ("20150105")),
PARTITION p20160101 VALUES [("20160101"), ("20160102")),
PARTITION p20170101 VALUES [("20170101"), ("20170102"))
)
DISTRIBUTED BY HASH(STATIC_DATE) BUCKETS 32
PROPERTIES (
"replication_num" = "3"
)
;
2.批量创建分区
通过 START、END 指定批量分区的开始和结束,EVERY 子句指定分区增量值。其中,批量分区包含 START 的值,但是不包含 END 的值。
# 表名大写,与hive表名一致;DT 类型为 BIGINT
CREATE TABLE OL_TABLE_SR
(
STATIC_DATE DATE COMMENT '统计日期' ,
STATIC_YEAR BIGINT COMMENT '统计年' ,
STATIC_MONTH BIGINT COMMENT '统计月' ,
STATIC_DAY BIGINT COMMENT '统计天' ,
ONE_DEPT STRING COMMENT '事业部' ,
DT STRING COMMENT '该时间全量数据'
) ENGINE=OLAP
DUPLICATE KEY(STATIC_DATE, STATIC_YEAR,STATIC_MONTH)
PARTITION BY RANGE(STATIC_DATE)
(
START ("2023-01-01") END ("2023-01-04") EVERY (INTERVAL 1 day)
)
DISTRIBUTED BY HASH(STATIC_DATE) BUCKETS 32
PROPERTIES (
"replication_num" = "3"
)
;
二、insert 数据写入(读外表写入内表,2种方式)
1.方式1:指定分区
# LABEL 名自定义即可
# 通过命令查询insert任务进进度和状态:SHOW LOAD WHERE label="insert_load_p20150104"\G;
insert overwrite OL_CUBE_RPT_INTEGRATED_INCOME_ALL_STARROCKS_I_PT PARTITION(p20150104)
WITH LABEL insert_load_p20150104
select * from test.OL_TABLE_SR
where dt='20150104';
2.方式2:动态插入分区
# LABEL 名自定义即可
# 通过以下命令查询insert任务进进度和状态:
# SHOW LOAD WHERE label="insert_load_dy_20230103"\G;
insert overwrite ol_dt_i_pt
WITH LABEL insert_load_dy_20230103
select
STATIC_DATE
,STATIC_YEAR
,STATIC_MONTH
,STATIC_DAY
,ONE_DEPT
,DT
from OL_DT_TEST
where DT>='20230101' and DT<'20230104'
;
三:问题:
1.若insert失败
报错:ERROR 1064 (HY000): Query timeout. Increase the query_timeout session variable and retry
需要调整 query_timeout
# 单位s,默认为300秒
set query_timeout =3000;
Session变量,默认为300秒,可以通过show variables like ‘%query_timeout%’;查看。
Insert Into本身也是一个SQL命令,因此Insert Into语句也受到Session变量query_timeout的限制。
可以通过SET query_timeout = xxx;来增加超时时间,单位是秒,同样,也可以通过增加global关键词让设置全局生效。
2.查询DT为空
当前 Hive 元数据缓存模式为懒加载,即:如果 Hive 新增了分区,StarRocks 只会将新增分区的 partition key 进行缓存,不会立即缓存该分区的文件信息。只有当查询该分区时或者用户手动执行 refresh 分区操作时,该分区的文件信息才会被加载。StarRocks 首次缓存该分区统计信息后,该分区后续的元数据变更就会自动同步到 StarRocks 中。
mysql> REFRESH EXTERNAL TABLE OL_DT_TEST;
Query OK, 0 rows affected (1 min 2.21 sec)
mysql> select distinct DT from test.OL_DT_TEST;
+----------+
| DT |
+----------+
| 20170101 |
+----------+
1 row in set (0.63 sec)