当前位置: 首页 > news >正文

ArgoDB表类型及常用命令

ArgoDB表类型及常用命令


beeline 连接 ArgoDB

beeline -u "jdbc:transwarp2://<ip/hostname>:<port>/<database_name>" -n <username> -p <password>

<ip/hostname>:需要连接的 Quark 服务中,Quark Server 角色所在节点的 IP 地址或主机名。
<port>:需要连接的 Quark 服务中,配置参数 hive.server2.thrift.port 的值,默认为 10000。
<database_name>:要连接到的数据库,部署时会默认自动创建 default 和 system 数据库。
<username>:用于身份认证的用户名。
<password>:用户名对应的密码。

例如:
beeline -u "jdbc:transwarp2://argodb01:10000/default" -n admin -p admin
beeline -u "jdbc:transwarp2://192.168.100.11:10000/default" -n admin -p admin


ArgoDB常用命令

show databases;
show tables;
desc default.test01;
show create table default.test01;
create table xxx;  -- 后面有常用类型表的建表详细介绍

ArgoDB表类型及表操作

ArgoDB表的存储类型有:
TEXTFILE
ORC
ORC_TRANSACTION
CSVFILE
EXCEL
JSON
FWCFILE
SEQUENCEFILE
RCFILE
HOLODESK
PARQUET
HYPERDRIVE
ESDRIVE
SEARCH
一般 ETL 数据归集的目的表类型推荐用 HOLODESK 类型表,支持 INSERT INTO VALUES 方式写数据。show create table xxx; 可查看表的相关属性、包括表类型。


ArgoDB 表的 rowkey 属性

ArgoDB中 rowkey 是关系数据库系统中用于确保一条记录的唯一标识和正确引用的一系列列(或字段)。因此被设置为 rowkey 的字段(或一系列列)是唯一的、且不允许为空。
在 ArgoDB 中,用户在创建表时,可以选择手动定义 rowkey(user defined rowkey)来创建 rowkey 表。也可以不定义,此时系统会在内部自动生成 internal rowkey 作为每条数据的唯一标识。
ArgoDB 中的 rowkey 在功能上与传统主键类似,都是一个非空且唯一的字段。但在行为上与传统的primary key 有所差别,这可以从当第二次插入相同的主键,Argodb 不会出现报错而是覆盖原数据可以得证。
内部 internal rowkey 的生成是分布式的,能够保证所有数据的 internal rowkey 都不相同,所以即便在大批量写入的场景下也不会产生热点问题。

rowkey的使用限制:

1)被设置为 rowkey 的字段是唯一且非空的列或者列组合,同时只能在一个语句里设置多列为表的rowkey。
2)Argodb 中定义rowkey 必须基于创建分桶表时设定 TBLPROPERTIES 实现。rowkey 表的 rowkey 列必须与分桶列完全一致。
3)不支持修改 rowkey,如需修改 rowkey 请重新建表。


ArgoDB 分区和分桶

面对大规模数据时,通过良好的分区/分桶设计,可有效减少查询时要扫描的数据范围,提升查询效率。
分区:通过特定条件(例如值相等)将表的数据分发到分区目录中。
分桶:通过分桶键哈希取模(key hashcode %N)的方式,将表或分区中的数据随机分发到桶中。
分区和分桶的数量并非越多越好,建议如下:

分区建议:
1)避免使用多级分区,以免产生过多分区数影响计算和存储性能。
2)基于时间分区时,推荐按照年或月进行分区,颗粒度太细可能产生过多的分区影响性能。
3)可选择 GROUP BY 或 DISTINCT 包含的列作为分区列。
4)避免选择存在数据倾斜的列作为分区列。

分桶建议:
1)选择离散度高的列作为分桶字段,避免桶的数据量悬殊过大,让数据均匀分布。推荐在分桶操作前,查看每列的字段值数量分布情况。
2)选择长度较短的列作为分桶字段,避免影响分桶判断的性能。
3)不对分桶表执行 automerge,避免削弱或干扰分桶的优化作用。
4)手动分桶时,选择的分桶数量不要产生过多的小文件,每个分桶建议不小于 200 MB。
5)分桶梳理建议为质数,且小于 CPU 总核数。

分桶

使用 CREATE TABLE CLUSTERED BY 创建分桶表。
注意事项:
1)分桶只能在创建分桶表中直接定义,不支持对已有分桶表进行修改。
2)ArgoDB 3.2.2版本及后续版本已支持自动分桶(不指定分桶数的条件下自动分桶),创建分桶表时可以不使用 INTO <num_buckets> BUCKETS 指定分桶数,分桶数默认为比磁盘数 *5 大的质数。
  这个分桶数一般严重偏大不符合最佳实践,5 是由参数 argodb.default.bucket.ratio 的默认值决定,具体可由用户自行调整。


分区

分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。数据实际上是存储在分区上的。
分区以文件目录的形式存在,且分区列是一个虚拟列。因此分区键不能存在于表的字段中,但可以作为一个“伪”列在查询中使用。

ArgoDB 数据库常用的分区表为单值分区表、范围分区表。

使用 CREATE TABLE PARTITION BY 创建单值分区表。
使用 CREATE TABLE PARTITION BY RANGE 创建范围分区表。

单值分区表:将数据基于数值映射到每一个分区,这是由向数值分区表导入数据时生成的。
单值分区导入数据支持两种:静态插入和动态插入。动态插入的时候必须要设置动态分区插入参数 SET hive.exec.dynamic.partition = TRUE;

注意事项:
1)单值分区不支持在建表的时候导入数据,创建分区表和导入数据必须分开执行。
2)分区字段的取名一定要和数据源表的对应列名相同,否则在导入数据时会报错:Partition spec {...} contains non-partition columns。
3)推荐使用STRING字段做分区字段,尽量不要使用其他字段,常见的可以选择时间字段。
4)常规物理机配置时,一般单个分区的数据量控制在500GB左右。
5)集群CPU数量比较多时,可以考虑单分区管理500GB~2TB左右的数据,更大的集群建议研发参与设计。
6)一般不使用多级分区,但多级分区过滤效果非常出色可以考虑使用。
7)动态分区插入性能较差,且由于入库排序,对磁盘性能要求较高,虚拟机可能出现 Fetch Timeout。


范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。

注意事项:
范围分区表只能使用直接定义列的方式建表。


-- 创建表
drop table if exists default.test01;
create table default.test01 (
    id bigint comment 'id',
    info string comment 'info',
    cnt int comment 'cnt'

comment '测试' 
stored as holodesk;

desc default.test01;
show create table default.test01;

insert into default.test01 (id,info,cnt) values (1,'aaa',100);
insert into default.test01 (id,info,cnt) values (2,'bbb',110);
insert into default.test01 (id,info,cnt) values (3,'ccc',200),(4,'ddd',250);
insert into default.test01 (id,info,cnt) values (4,'ddd',300);
select * from default.test01;


-- 创建主键(rowkey)表(隐式分桶)
drop table if exists default.test02_pk;
create table default.test02_pk (
    id bigint comment '主键',
    info string comment 'info',
    cnt int comment 'cnt'

comment '测试' 
stored as holodesk tblproperties('holodesk.rowkey'='id');

desc default.test02_pk;
show create table default.test02_pk;

建表没有显示指定分桶属性、但指定了rowkey,创建出来的表 rowkey 对应的字段 id 也是分桶字段。

insert into default.test02_pk (id,info,cnt) values (1,'aaa',100);
insert into default.test02_pk (id,info,cnt) values (2,'bbb',110);
insert into default.test02_pk (id,info,cnt) values (1,'a02',200); --ok: update
insert into default.test02_pk (id,info,cnt) values (1,'a03',300); --ok: update
insert into default.test02_pk (id,info,cnt) values (1,NULL,302);  --ok: update
delete from default.test02_pk where id = 3; --ok
delete from default.test02_pk where id = 2; --ok

select * from default.test02_pk;


-- 创建分区分桶表(clustered by 显示指定分桶)
create table default.test03_pk_pt_bucket (
    id bigint comment '主键',
    name string comment '姓名',
    age int comment '年龄',
    salary double comment '得分',
    ts timestamp default systimestamp comment '时间戳'

comment '测试' 
partitioned by (
dt string 
) clustered by (
id
) into 3 buckets stored as holodesk tblproperties(
'holodesk.rowkey'='id'
);

SELECT * FROM test03_pk_pt_bucket;

-- INSERT INTO 插入数据会自动创建分区
INSERT INTO test03_pk_pt_bucket PARTITION(dt='20250321') (id,name,age,salary,ts) VALUES (1,"zs",30,128.50,"2025-03-21 13:00:00");
INSERT INTO test03_pk_pt_bucket PARTITION(dt='20250321') (id,name,age,salary,ts) VALUES (1,"zs",30,155.80,"2025-03-21 13:01:00"); -- update
INSERT INTO test03_pk_pt_bucket PARTITION(dt="20250321") (id,name,age,salary,ts) VALUES (2,'ls',28,180.00,'2025-03-21 13:02:00.123456');
INSERT INTO test03_pk_pt_bucket PARTITION(dt="20250322") (id,name,age,salary,ts) VALUES (3,'ww',27,110.50,'2025-03-22 09:30:00.444555');
INSERT INTO test03_pk_pt_bucket PARTITION(dt="20250323") (id,name,age,salary,ts) VALUES (4,'zb',35,120.00,'2025-03-23 12:30:00.555666'),(5,'lh',38,151.00,'2025-03-23 15:28:00.888999');

show partitions test03_pk_pt_bucket;
+--------------+
|  partition   |
+--------------+
| dt=20250321  |
| dt=20250322  |
| dt=20250323  |
+--------------+

select * from test03_pk_pt_bucket;
select * from test03_pk_pt_bucket where dt='20250321';
select * from test03_pk_pt_bucket where dt='20250322';
select * from test03_pk_pt_bucket where dt='20250323';


create table default.test03_pk_pt_bucket_copy (
    id bigint comment '主键',
    name string comment '姓名',
    age int comment '年龄',
    salary double comment '得分',
    ts timestamp default systimestamp comment '时间戳'

comment '测试' 
partitioned by (
dt string 
) clustered by (
id
) into 3 buckets stored as holodesk tblproperties(
'holodesk.rowkey'='id'
);

-- 支持动态创建分区;
set argodb.dynamic.create.partition.enabled=true;
-- 是否允许动态分区,默认值:false。使用动态分区时候,该参数必须设置成 true,插入数据时,分区列自动查找分区键并写入对应分区
set hive.exec.dynamic.partition=true;
set stargate.dynamic.partition.enabled=true;
-- 动态分区的分区模式设置,默认值:strict,表示必须指定至少一个分区为静态分区。nonstrict:表示允许所有的分区字段都可以使用动态分区。
set hive.exec.dynamic.partition.mode=nonstrict;

-- 动态分区的方式批量插入数据
insert into test03_pk_pt_bucket_copy select * from test03_pk_pt_bucket;
insert into test03_pk_pt_bucket_copy select id,name,age,salary,ts,dt from test03_pk_pt_bucket;
select * from test03_pk_pt_bucket_copy;
show partitions test03_pk_pt_bucket_copy;

truncate table test03_pk_pt_bucket_copy;
alter table test03_pk_pt_bucket_copy drop partition (dt=20250321);
alter table test03_pk_pt_bucket_copy drop partition (dt=20250322);
alter table test03_pk_pt_bucket_copy drop partition (dt='20250323');
show partitions test03_pk_pt_bucket_copy;

-- insert into select 插入方式指定分区插入时,目的表常规字段不包含分区列字段,分区列字段由partition(dt=20250321)指定,所以 select 不能用 select * 而必须 select 指定的字段名(不包含分区字段)
insert into test03_pk_pt_bucket_copy partition(dt=20250321) select id,name,age,salary,ts from test03_pk_pt_bucket where dt=20250321;
show partitions test03_pk_pt_bucket_copy;
select * from test03_pk_pt_bucket_copy;

-- 创建分区分桶表(clustered by 显示指定分桶、多个分区字段-二级分区)
create table default.test03_pk_pt2_bucket (
    id bigint comment '主键',
    name string comment '姓名',
    age int comment '年龄',
    salary double comment '得分',
    ts timestamp default systimestamp comment '时间戳'

comment '测试' 
partitioned by (
dt string,
city string
) clustered by (
id
) into 3 buckets stored as holodesk tblproperties(
'holodesk.rowkey'='id'
);

SELECT * FROM test03_pk_pt2_bucket;

-- INSERT INTO 插入数据会自动创建分区
INSERT INTO test03_pk_pt2_bucket PARTITION(dt='20250321',city='hangzhou') (id,name,age,salary,ts) VALUES (1,"zs",30,128.50,"2025-03-21 13:00:00");
INSERT INTO test03_pk_pt2_bucket PARTITION(dt='20250321',city='hangzhou') (id,name,age,salary,ts) VALUES (1,"zs",30,155.80,"2025-03-21 13:01:00"); -- update
INSERT INTO test03_pk_pt2_bucket PARTITION(dt='20250321',city='wenzhou') (id,name,age,salary,ts) VALUES (2,'ls',28,180.00,'2025-03-21 13:02:00.123456');
INSERT INTO test03_pk_pt2_bucket PARTITION(dt='20250322',city='hangzhou') (id,name,age,salary,ts) VALUES (3,'ww',27,110.50,'2025-03-22 09:30:00.444555');
INSERT INTO test03_pk_pt2_bucket PARTITION(dt='20250323',city='wenzhou') (id,name,age,salary,ts) VALUES (4,'zb',35,120.00,'2025-03-23 12:30:00.555666'),(5,'lh',38,151.00,'2025-03-23 15:28:00.888999');


create table default.test03_pk_pt2_bucket_copy (
    id bigint comment '主键',
    name string comment '姓名',
    age int comment '年龄',
    salary double comment '得分',
    ts timestamp default systimestamp comment '时间戳'

comment '测试' 
partitioned by (
dt string,
city string
) clustered by (
id
) into 3 buckets stored as holodesk tblproperties(
'holodesk.rowkey'='id'
);

-- 支持动态创建分区(多分区字段)
set argodb.dynamic.create.partition.enabled=true;
-- 是否允许动态分区,默认值:false。使用动态分区时候,该参数必须设置成 true,插入数据时,分区列自动查找分区键并写入对应分区
set hive.exec.dynamic.partition=true;
set stargate.dynamic.partition.enabled=true;
-- 动态分区的分区模式设置,默认值:strict,表示必须指定至少一个分区为静态分区。nonstrict:表示允许所有的分区字段都可以使用动态分区。
set hive.exec.dynamic.partition.mode=nonstrict;

-- 动态分区的方式批量插入数据
insert into test03_pk_pt2_bucket_copy select * from test03_pk_pt2_bucket;
insert into test03_pk_pt2_bucket_copy select id,name,age,salary,ts,dt,city from test03_pk_pt2_bucket;
insert into test03_pk_pt2_bucket_copy select id,name,age,salary,ts,dt,city from test03_pk_pt2_bucket where dt='20250321' and city='hangzhou';
insert into test03_pk_pt2_bucket_copy select id,name,age,salary,ts,dt,city from test03_pk_pt2_bucket where dt='20250321';
show partitions test03_pk_pt2_bucket_copy;
select * from test03_pk_pt2_bucket_copy;
select * from test03_pk_pt2_bucket_copy where dt=20250321;
select * from test03_pk_pt2_bucket_copy where dt='20250321' and city='hangzhou';


truncate table test03_pk_pt2_bucket_copy;
alter table test03_pk_pt2_bucket_copy drop partition (dt='20250321',city='hangzhou');
show partitions test03_pk_pt2_bucket_copy;
alter table test03_pk_pt2_bucket_copy drop partition (dt=20250321);
show partitions test03_pk_pt2_bucket_copy;
alter table test03_pk_pt2_bucket_copy drop partition (dt=20250322);
show partitions test03_pk_pt2_bucket_copy;
alter table test03_pk_pt2_bucket_copy drop partition (dt='20250323',city='wenzhou');
show partitions test03_pk_pt2_bucket_copy;


-- insert into select 插入方式指定分区插入时,目的表常规字段不包含分区列字段,分区列字段由partition(dt=20250321)指定,所以 select 不能用 select * 而必须 select 指定的字段名(不包含分区字段)
insert into test03_pk_pt2_bucket_copy partition(dt=20250321,city='hangzhou') select id,name,age,salary,ts from test03_pk_pt2_bucket where dt=20250321 and city='hangzhou';
show partitions test03_pk_pt2_bucket_copy;
select * from test03_pk_pt2_bucket_copy;


-- 范围分区表
CREATE TABLE test05_range_pt (trans_id INT, acc_num INT, trans_type STRING, stock_id STRING,price DECIMAL, amount INT)
PARTITIONED BY RANGE (trans_time DATE,t2 INT) (
PARTITION before2020 VALUES LESS THAN ('2020-01-01',1),
PARTITION before2025 VALUES LESS THAN ('2025-04-30',2)
);

show create table test05_range_pt;

-- 清空指定分区的数据(单值分区)
truncate table test03_pk_pt_bucket_copy PARTITION(dt=20250321);
truncate table test03_pk_pt_bucket_copy PARTITION(dt=20250322);
truncate table test03_pk_pt_bucket_copy PARTITION(dt='20250323');
select * from test03_pk_pt_bucket_copy;
select * from test03_pk_pt_bucket_copy;


-- 如果要清空范围分区的话、语法有区别:
-- truncate table tbName PARTITION ptName;


-- 清空整表
truncate table test03_pk_pt_bucket_copy;


-- 创建/删除分区
-- 单值分区表手动维护创建/删除分区
ALTER TABLE test03_pk_pt_bucket_copy DROP PARTITION(dt='20250321');
ALTER TABLE test03_pk_pt_bucket_copy ADD  PARTITION(dt='20250321');


-- 范围分区
-- 如果是范围分区表的话、创建分区语法有区别:
ALTER TABLE tbName ADD PARTITION pmin  VALUES LESS THAN('2023-12-31');
ALTER TABLE tbName ADD PARTITION p2024 VALUES LESS THAN('2024-12-31');
ALTER TABLE tbName ADD PARTITION p2025 VALUES LESS THAN('2025-12-31');
ALTER TABLE tbName ADD PARTITION pmax  VALUES LESS THAN(maxvalue);
ALTER TABLE tbName DROP PARTITION pmin;


-- 创建分区表(隐式分桶)
drop table if exists default.test04_pk_pt;
create table default.test04_pk_pt (
    id bigint comment '主键',
    name string comment '姓名',
    age int comment '年龄',
    salary double comment '薪资',
    ts timestamp default systimestamp comment '时间戳'

comment '测试' 
partitioned by (
dt string 
) stored as holodesk tblproperties(
'holodesk.rowkey'='id'
);

show create table default.test04_pk_pt;

-- 查询分区表的所有分区列表
SHOW PARTITIONS test04_pk_pt;

-- 查询所有数据
SELECT * FROM test04_pk_pt;

-- 查询指定分区的数据
SELECT * FROM test04_pk_pt WHERE dt='20250322';
SELECT * FROM test04_pk_pt WHERE dt='20250322';

INSERT INTO test04_pk_pt PARTITION(dt='20250321') (id,name,age,salary,ts) VALUES (1,'zs',30,128.50,'2025-03-21 13:00:00');
INSERT INTO test04_pk_pt PARTITION(dt='20250322') (id,name,age,salary,ts) VALUES (2,'ls',32,150.80,'2025-03-22 14:02:00'), (3,'ww',28,525.00,'2025-03-22 14:03:00');
INSERT INTO test04_pk_pt PARTITION(dt='20250323') (id,name,age,salary,ts) VALUES (4,'ls',32,210.50,'2025-03-22 15:05:00.123456789');


-- TEXT表

TEXT表是文本格式的表,是默认的表格式。在数据量大的情况下,TEXT表的统计和查询性能都比较低;TEXT表也不支持事务处理,所以通常用于将文本文件中的原始数据导入ArgoDB中。
ArgoDB提供两种方式将文本文件中的数据导入TEXT表中:
1)建外部TEXT表,让该表指向HDFS上的一个目录,会将目录下文件中的数据都导入该表。星环科技推荐使用这个方式导入数据。
2)建TEXT表(外表内表皆可)后将本地或者HDFS上的一个文件或者一个目录下的数据 LOAD 进该表。这种方式在安全模式下需要多重认证设置,极易出错,星环科技不推荐使用这个方式导入数据。

-- 创建TEXT表
CREATE [TEMPORARY] --[1]
[EXTERNAL] TABLE <table_name> --[2]
(<column_name> <data_type>, <column_name> <data_type>, ...)
[PARTITIONED BY ...]--[3]
[CLUSTERED BY ...]--[4]
[ROW FORMAT ...] --[5]
[STORED AS TEXTFILE] --[6]
[LOCATION '<hdfs_path>'] --[7]
[TBLPROPERTIES ('<property_name>'='<property_value>', ...)];

-- 创建TEXT表
drop table if exists default.test11;
create table default.test11 (
    id bigint comment 'id',
    info string comment 'info',
    cnt int comment 'cnt'

comment '测试' 
stored as textfile;

desc default.test11;
show create table default.test11;

-- 不支持下列 insert into xxx values 的插入方式:
insert into default.test11 (id,info,cnt) values (1,'aaa',100);
insert into default.test11 (id,info,cnt) values (2,'bbb',110);
insert into default.test11 (id,info,cnt) values (3,'ccc',200),(4,'ddd',250);
insert into default.test11 (id,info,cnt) values (4,'ddd',300);

-- 仅支持 insert into xxx select * from 其他表的插入方式:
insert into default.test11 select * from default.test01;

select * from default.test11;

试了一下,text表创建时貌似即使指定了分桶和rowkey,实际也没有upset效果。


-- ORC/ORC_TRANSACTION表

ORC 非事务表的建表只需在建表语句中用 STORED AS ORC 指定存储格式为 ORC 即可。
ORC 事务表的建表则需要几个额外的重点步骤:
1)为表分桶:为了保证增删改过程中的性能,我们要求 ORC 事务表必须是部分排序或者全局排序的,但是全局排序又过于耗费计算资源,因此我们要求 ORC 表必须是分桶表。
2)如果表的数据量特别大,建议在分桶的基础上再分区,ORC 事务表支持单值分区和范围分区。


-- ORC/ORC_TRANSACTION表不支持rowkey属性

-- 创建ORC非事务表
drop table if exists default.test21;
create table default.test21 (
    id bigint comment 'id',
    info string comment 'info',
    cnt int comment 'cnt'

comment '测试' 
stored as orc;

desc default.test21;
show create table default.test21;

SELECT * FROM default.test21;

-- 不支持下列 insert into xxx values 的插入方式:
insert into default.test21 (id,info,cnt) values (1,'aaa',100);
insert into default.test21 (id,info,cnt) values (2,'bbb',110);
insert into default.test21 (id,info,cnt) values (3,'ccc',200),(4,'ddd',250);
insert into default.test21 (id,info,cnt) values (4,'ddd',300);

-- 仅支持 insert into xxx select * from 其他表的插入方式:
insert into default.test21 select * from default.test01;

select * from default.test21;


-- 创建OCR事务表(OCR事务表必须分桶)

非分区分桶表
CREATE TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...)
CLUSTERED BY (<bucket_key>) INTO <num_buckets> BUCKETS
STORED AS ORC_TRANSACTION;

单值分区分桶表
CREATE TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...)
PARTITIONED BY (<partition_key> <data_type>)
CLUSTERED BY (<bucket_key>) INTO <num_buckets> BUCKETS
STORED AS ORC_TRANSACTION;

范围分区分桶表
CREATE TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...)
PARTITIONED BY RANGE(<partition_key1> <data_type>, <partition_key2> <data_type>, ...) (
PARTITION [<partition_name_1>] VALUE LESS THAN(<key1_bound_value1>, <key2_bound_value1>, ...),
--[1]
PARTITION [partition_name_2] VALUE LESS THAN(key1_bound_value2, key2_bound_value2, ...),
...
)
CLUSTERED BY (<bucket_key>) INTO <num_buckets> BUCKETS
STORED AS ORC_TRANSACTION;


-- 创建ORC事务表-分区分桶表
drop table if exists default.test31_pt_bucket;
create table default.test31_pt_bucket (
    id bigint comment '主键',
    name string comment '姓名',
    age int comment '年龄',
    salary double comment '得分',
    ts timestamp default systimestamp comment '时间戳'

comment '测试' 
partitioned by (
dt string 
) clustered by (
id
) into 3 buckets stored as orc_transaction;


desc default.test31_pt_bucket;
show create table default.test31_pt_bucket;

SELECT * FROM test31_pt_bucket;

-- INSERT INTO 插入数据会自动创建分区
INSERT INTO test31_pt_bucket PARTITION(dt='20250321') (id,name,age,salary,ts) VALUES (1,"zs",30,128.50,"2025-03-21 13:00:00");
INSERT INTO test31_pt_bucket PARTITION(dt='20250321') (id,name,age,salary,ts) VALUES (1,"zs",30,155.80,"2025-03-21 13:01:00"); -- append
INSERT INTO test31_pt_bucket PARTITION(dt="20250321") (id,name,age,salary,ts) VALUES (2,'ls',28,180.00,'2025-03-21 13:02:00.123456');
INSERT INTO test31_pt_bucket PARTITION(dt="20250322") (id,name,age,salary,ts) VALUES (3,'ww',27,110.50,'2025-03-22 09:30:00.444555');
INSERT INTO test31_pt_bucket PARTITION(dt="20250323") (id,name,age,salary,ts) VALUES (4,'zb',35,120.00,'2025-03-23 12:30:00.555666'),(5,'lh',38,151.00,'2025-03-23 15:28:00.888999');

SELECT * FROM test31_pt_bucket;

http://www.xdnf.cn/news/699625.html

相关文章:

  • 491. Non-decreasing Subsequences
  • DeepSeek R1 与 V3 的全面对比,两个版本有什么差别?
  • 【Linux】linux上看到的内存和实际内存不一样?
  • Linux云计算训练营笔记day17(Python)
  • Cisco Packer Tracer 组建虚拟局域网(VLAN)
  • 【前端】【Jquery】一篇文章学习Jquery所有知识点
  • keepalived两台设备同时出现VIP问题
  • MySql--explain的用法
  • 【Linux网络篇】:简单的TCP网络程序编写以及相关内容的扩展
  • css样式块重复调用
  • 楼宇自控系统重塑建筑设备管理:告别低效,迈向智能管理时代
  • 华为OD机试真题——书籍叠放(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • Linux系统之cal命令的基本使用
  • 国有企业采购方式及适用情形
  • Java集合进阶
  • C++补充基础小知识:什么是接口类 和 抽象类?为什么要继承?
  • 线程的生命周期?怎么终止线程?线程和线程池有什么区别?如何创建线程池?说一下 ThreadPoolExecutor 的参数含义?
  • yolov12毕设前置知识准备 1
  • Linux基本指令/上
  • Python常用模块实用指南
  • Python人工智能算法学习 禁忌搜索算法求解旅行商问题(TSP)的研究与实现
  • .net Winfrom 如何将窗口设置为MDI容器
  • QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)
  • Git:现代软件开发的基石——原理、实践与行业智慧·优雅草卓伊凡
  • go实例化结构体的方式
  • 【C/C++】设计模式之工厂模式:从简单到抽象的演进
  • 《接口和抽象类到底怎么选?设计原则与经典误区解析》
  • com.alibaba.fastjson.JSONException: default constructor not found.
  • 【25-cv-05887、25-cv-05893、25-cv-05897】一张图片连发3案!
  • 【Python实例】读取/处理 Landsat LST数据