本文介绍如何访问Lindorm列存数据。
背景信息
- 计算分析
Lindorm计算引擎可以访问列存数据,完成海量数据的交互式分析和离线计算。列存提供丰富的索引能力和数据分布特征,可以有效加速计算过程中的数据定位与排布,通过SQL即可完成海量主键数据的增删改查。
- 高吞吐
列存引擎吞吐能力支持水平扩展,提供每分钟TB级数据的读写能力。适用于车联网数据快速导入、模型训练数据集存取和大规模报表分析生产等高吞吐数据场景。
- 低成本
通过列格式高压缩比算法、高密度低成本介质、冷热分离、多压缩编码和数据冷归档等技术,Lindorm列存相比自建系统存储成本显著降低,满足海量数据归档留存等低成本存储需求。
- 高可用
通过纠删码等技术,Lindorm列存保证了分布式数据集的高可用性,同时保证了数据访问无单点。
注意事项
访问Lindorm列存数据功能目前处于邀测阶段,如有使用需求,请联系Lindorm技术支持(钉钉号:s0s3eg3)。
前提条件
- 已阅读使用须知。
- 根据不同的作业形态,请确保已经完成了以下操作:
- JDBC开发实践:JDBC开发实践。
- JAR作业开发实践:JAR作业开发实践。
- Python作业开发实践:Python作业开发实践。
功能说明
DDL
DML
最佳实践
您可以通过以下方案,加速数据查询或计算。
主键数据查询
如果表中存储了海量数据集,查询时可以指定通过主键过滤条件,实现加速效果。查询时,主键的数据范围设置得越小,加速效果越好。
假设表结构如下:
USE lindorm_columnar;
CREATE TABLE orders
(
o_orderkey int,
o_custkey int,
o_orderstatus string,
o_totalprice double ,
o_orderdate string ,
o_orderpriority string,
o_clerk string,
o_shippriority int,
o_comment string
)
PARTITIONED BY (bucket(1024,o_orderkey,o_custkey))
TBLPROPERTIES(
'lce.primaryKey' = 'o_orderkey,o_custkey'
);
USE lindorm_columnar;
SELECT * FROM orders WHERE o_orderkey=18394 AND o_custkey=81772;
USE lindorm_columnar;
SELECT count(*) FROM orders WHERE o_orderkey>100000 AND o_orderkey<200000;
USE lindorm_columnar;
SELECT count(*) FROM orders WHERE o_orderkey>100000 AND o_custkey<99;
USE lindorm_columnar;
SELECT count(*) FROM orders WHERE o_orderkey>100000;
添加分区过滤
Lindorm列存引擎中不同分区之间彼此物理隔离,因此,通过添加分区过滤条件,可以加速数据查询。
假设表结构如下:
USE lindorm_columnar;
CREATE TABLE orders
(
o_orderkey int,
o_custkey int,
o_orderstatus string,
o_totalprice double ,
o_orderdate string ,
o_orderpriority string,
o_clerk string,
o_shippriority int,
o_comment string
)
PARTITIONED BY (o_orderdate, bucket(1024,o_orderkey,o_custkey))
TBLPROPERTIES(
'lce.primaryKey' = 'o_orderdate,o_orderkey,o_custkey'
);
USE lindorm_columnar;
SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate='2022-01-01' GROUP BY o_orderdate;
USE lindorm_columnar;
SELECT o_orderdate, count(*) FROM orders WHERE o_orderdate>='2022-01-01' AND o_orderdate<='2022-01-07' GROUP BY o_orderdate;
非主键条件查询
针对分区整理过程,可以在建表时配置参数lce.compact.major.splitKey,指定二级排序键。 在主键的基础上,基于其他若干列进行二次排序,从而加速非主键条件查询。
假设表结构如下:
USE lindorm_columnar;
CREATE TABLE orders
(
o_orderkey int,
o_custkey int,
o_orderstatus string,
o_totalprice double ,
o_orderdate string ,
o_orderpriority string,
o_clerk string,
o_shippriority int,
o_comment string
)
PARTITIONED BY (bucket(1024,o_orderkey,o_custkey))
TBLPROPERTIES(
'lce.primaryKey' = 'o_orderkey,o_custkey',
'lce.compact.major.splitKey' = 'o_shippriority,o_totalprice'
);
COMPACT orders FORCE MAJOR;
您可以使用以下SQL语句查询已完成分区整理的表中的数据。
USE lindorm_columnar;
SELECT count(*) FROM orders WHERE o_shippriority=0;
USE lindorm_columnar;
SELECT count(*) FROM orders WHERE o_shippriority=0 AND o_totalprice>999.9;
数据关联
列存表中的bucket分区方式影响了数据分布特征,对于两个海量数据集,您可以基于关联条件定义相同的bucket分区方式,从而加速关联计算过程。
假设表结构如下:
USE lindorm_columnar;
# 表orders0结构:
CREATE TABLE orders0
(
o_orderkey int,
o_custkey int,
o_orderstatus string,
o_totalprice double ,
o_orderdate string ,
o_orderpriority string,
)
PARTITIONED BY (o_orderdate, bucket(1024,o_orderkey))
TBLPROPERTIES(
'lce.primaryKey' = 'o_orderdate,o_orderkey'
);
# 表orders1结构:
CREATE TABLE orders1
(
o_orderkey int,
o_custkey int,
o_orderdate string ,
o_clerk string,
o_shippriority int,
o_comment string
)
PARTITIONED BY (o_orderdate, bucket(1024,o_orderkey))
TBLPROPERTIES(
'lce.primaryKey' = 'o_orderdate,o_orderkey'
);
表orders0和表orders1中,每天(o_orderdate)的bucket分区方式都相同:bucket(1024,o_orderkey)
。因此,将两张表单天的数据按照bucket分区字段(o_orderkey)关联,可以得到更好的加速效果。
关联查询示例如下:
USE lindorm_columnar;
SELECT * FROM orders0 a
JOIN
orders1 b
ON a.o_orderkey=b.o_orderkey AND a.o_orderdate=b.o_orderdate
WHERE o_orderdate='2022-01-01';
查询加速
对指定表或者表中的指定分区进行数据整理(Compaction),可以增强数据的有序性或紧凑性,从而提升数据扫描性能。
CREATE TABLE hello_tbl
(id int, city string, name string, score int)
partitioned by (city, hash(4, id))
tblproperties('lce.primaryKey' = 'id,city');
COMPACT hello_tbl FORCE MAJOR;
COMPACT hello_tbl PARTITION (city='beijing') FORCE MAJOR;
完成数据整理后,如果想要进一步提升后续查询的效率,可以执行以下语句设置表的相关参数来加速后续查询:
ALTER TABLE hello_tbl SET TBLPROPERTIES ('lce.scan.majorCompactFilesOnly' = true);
- true:只查询已完成数据整理的数据,忽略增量写入且未完成数据整理的数据。
- false:默认值。查询所有数据。
ALTER TABLE hello_tbl SET TBLPROPERTIES ('lce.scan.enableVectorizedReader' = true);
- true:以向量化方式加速数据查询。仅在lce.scan.majorCompactFilesOnly配置为true时生效。
- false:默认值。不以向量化方式加速数据查询。