本文介绍数据探查中 SQL 探查支持的常用语法、数据类型、结果限制和使用建议。SQL 探查适用于通过 SQL 快速查询 Apache Paimon 表、Paimon 系统表以及 DLF 内置探查视图。
使用限制和建议
-
写入限制:SQL 探查默认不能写入数据,适合执行查询、数据预览、聚合分析和允许范围内的 DDL 操作。
-
返回行数限制:查询类语句默认最多返回
1000行,最大不超过10000行。建议为交互式查询显式添加LIMIT。 -
多语句执行:支持一次提交多条 SQL 语句,语句之间使用英文分号
;分隔。系统按顺序执行,某条语句失败后会停止执行后续语句。 -
默认上下文:SQL 探查使用页面上方选择的 Catalog 和 Database 作为默认上下文。SQL 中可以直接引用当前 Database 下的表,也可以使用
database.table进行引用。 -
多模态检索:
vector_search(...)和full_text_search(...)适用于已具备对应向量索引或全文索引的表。
SQL 语法
元数据查询
查看当前 Database 下的表:
SHOW TABLES;
查看表字段信息:
DESCRIBE orders;
查询指定 Database 下的表:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = '<database_name>'
ORDER BY table_name;
查询指定表的字段:
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = '<database_name>'
AND table_name = '<table_name>'
ORDER BY ordinal_position;
-
SHOW TABLES查询的是当前页面选择的 Catalog 和 Database 下的表。 -
如需查询指定 Database 下的表或字段,建议使用
information_schema.tables和information_schema.columns。
基础查询
简单查询
查询当前 Database 下的表:
SELECT id, name, dt
FROM orders
WHERE dt = '<partition_date>'
LIMIT 100;
查询指定 Database 下的表:
SELECT id, name
FROM sales.orders
WHERE id = 1001
LIMIT 100;
字段选择
SELECT name
FROM users
LIMIT 100;
过滤、排序和分页
SELECT id, name, amount
FROM orders
WHERE dt = '<partition_date>'
AND amount > 100
ORDER BY amount DESC
LIMIT 100;
聚合查询
SELECT category, COUNT(*) AS cnt
FROM goods
GROUP BY category
ORDER BY cnt DESC
LIMIT 100;
多表关联查询
SELECT u.id, u.name, s.score
FROM users u
JOIN scores s
ON u.id = s.id
WHERE s.score >= 80
LIMIT 100;
子查询
SELECT id, name
FROM users
WHERE id IN (
SELECT user_id
FROM orders
WHERE dt = '<partition_date>'
)
LIMIT 100;
CTE 查询
WITH filtered AS (
SELECT *
FROM orders
WHERE dt = '<partition_date>'
)
SELECT COUNT(*) AS cnt
FROM filtered;
Time Travel
Time Travel 用于查询 Paimon 表的历史版本。可以通过 Snapshot ID、Tag 名称或时间戳指定读取版本。
按 Snapshot ID 查询:
SELECT id, name
FROM orders VERSION AS OF <Snapshot ID>
LIMIT 100;
按 Tag 查询:
SELECT id, name
FROM orders VERSION AS OF '<tag_name>'
LIMIT 100;
按时间戳查询:
SELECT id, name
FROM orders TIMESTAMP AS OF '<timestamp>'
LIMIT 100;
查询指定 Database 下表的历史版本:
SELECT id, name
FROM sales.orders VERSION AS OF <Snapshot ID>
LIMIT 100;
-
可通过 Paimon 系统表
$snapshots查询可用 Snapshot,通过$tags查询可用 Tag。 -
TIMESTAMP AS OF的时间戳格式为YYYY-MM-DD HH:mm:ss。 -
Time Travel 只影响对应查询语句读取的数据版本,不会修改表数据。
多模态检索
Vector Search
vector_search(...) 用于基于向量列进行相似度检索。参数依次为表名、向量列名、查询向量和返回条数。
语法如下:
SELECT *
FROM vector_search('<database_name>.<table_name>', '<vector_column>', '<query_vector_json_array>', <top_k>);
示例如下。执行前,请在页面上方选择目标 Catalog。
SELECT *
FROM vector_search(
'multimodal_samples.berkeley_deepdrive_100k_images',
'image_embedding',
'<query_vector_json_array>',
3
);
Full-text Search
full_text_search(...) 用于基于文本列进行全文检索。参数依次为表名、文本列名、查询文本和返回条数。
语法如下:
SELECT *
FROM full_text_search('<database_name>.<table_name>', '<text_column>', '<query_text>', <top_k>);
查询关键词。执行前,请在页面上方选择目标 Catalog。
SELECT *
FROM full_text_search(
'multimodal_samples.berkeley_deepdrive_100k_images',
'tags',
'traffic',
5
);
查询短语:
SELECT *
FROM full_text_search(
'multimodal_samples.berkeley_deepdrive_100k_images',
'tags',
'"traffic light"',
5
);
动态参数语句
可以使用 SET 和 RESET 在一次提交中临时设置 Paimon 查询参数。该设置仅对当前提交中的后续语句生效。例如,临时指定 Snapshot 版本查询历史数据:
SET 'paimon.scan.version' = '<Snapshot ID>';
SELECT id, name
FROM orders
LIMIT 100;
RESET 'paimon.scan.version';
DDL 语句
创建和删除 Database
在 SQL 中使用 SCHEMA 语法,对应 DLF 中的 Database(数据库)。
CREATE SCHEMA IF NOT EXISTS demo_db;
DROP SCHEMA IF EXISTS demo_db CASCADE;
创建 Append 表
CREATE TABLE IF NOT EXISTS demo_db.orders (
order_id BIGINT,
price BIGINT,
customer STRING
);
创建主键表
CREATE TABLE IF NOT EXISTS demo_db.orders_pk (
order_id BIGINT,
price BIGINT,
customer STRING,
PRIMARY KEY (order_id) NOT ENFORCED
);
创建分区表
分区字段需要先在表字段中声明,再通过 PARTITIONED BY 指定。
CREATE TABLE IF NOT EXISTS demo_db.events (
event_id BIGINT,
event_name STRING,
dt STRING
)
PARTITIONED BY (dt);
修改表结构
ALTER TABLE demo_db.orders
ADD COLUMN remark STRING;ALTER TABLE demo_db.orders
RENAME COLUMN remark TO comment;
删除表
DROP TABLE IF EXISTS demo_db.orders;
临时表和临时视图
临时对象仅在当前 SQL 提交内可见,适合在多语句中组织中间结果。
CREATE TEMPORARY TABLE tmp_users AS
SELECT * FROM (VALUES (1, 'alice'), (2, 'bob')) AS t(id, name);
SELECT COUNT(*) FROM tmp_users;
DROP TEMPORARY TABLE tmp_users;CREATE TEMPORARY VIEW tmp_view AS
SELECT * FROM orders WHERE dt = '<partition_date>';
SELECT COUNT(*) FROM tmp_view;
DROP TEMPORARY VIEW tmp_view;
删除分区
ALTER TABLE demo_db.events
DROP PARTITION (dt = '<partition_date>');
Paimon 系统表查询
可以通过 $ 后缀查询 Paimon 表的元数据。
查询表参数
SELECT key, value
FROM demo_db.orders$options;
查询 Schema 历史
SELECT *
FROM demo_db.orders$schemas;
查询 Snapshot
SELECT *
FROM demo_db.orders$snapshots
ORDER BY snapshot_id DESC
LIMIT 10;
查询 Tag
SELECT *
FROM demo_db.orders$tags;
查询 Manifest
SELECT *
FROM demo_db.orders$manifests
LIMIT 10;
查询分区统计
SELECT *
FROM demo_db.orders$partitions;
查询文件大小统计
SELECT *
FROM demo_db.orders$physical_files_size;
SELECT *
FROM demo_db.orders$referenced_files_size;
DLF 内置系统表查询
DLF 提供部分内置系统表,用于查看表存储、分区、计算和权限相关统计。详细使用方式请参见表与分区存储统计、湖表优化资源消耗和增量日志。
表存储概览
SELECT dt,
COUNT(DISTINCT table_id) AS table_cnt,
SUM(obj_size) + SUM(meta_obj_size) AS total_size,
SUM(obj_size) AS total_data_obj_size,
SUM(meta_obj_size) AS total_meta_obj_size
FROM system.table_summary
WHERE dt BETWEEN '<start_date>' AND '<end_date>'
GROUP BY dt
ORDER BY dt;
分区存储统计
SELECT database_name, table_name, partition_name,
obj_cnt AS data_obj_cnt,
obj_size AS data_obj_size
FROM system.partition_summary
WHERE dt = '<partition_date>'
ORDER BY data_obj_size DESC
LIMIT 100;
计算用量趋势
SELECT dt,
SUM(cu) AS daily_cu,
MIN(start_time) AS min_start_time,
MAX(start_time) AS max_start_time
FROM system.compute_usage
WHERE dt BETWEEN '<start_date>' AND '<end_date>'
GROUP BY dt
ORDER BY dt;
权限授权查询
SELECT principal, principal_kind, principal_name,
database_name, object_name, resource_type, access
FROM system.auth_privilege_grants
WHERE dt = '<partition_date>'
AND access = 'SELECT'
ORDER BY database_name, object_name, principal;
数据类型
数据探查建表时支持以下数据类型,并映射到对应的 Paimon 类型。
|
SQL 类型 |
Paimon 类型 |
说明 |
|
|
|
布尔类型,取值为 |
|
|
|
1 字节整数,适用于较小范围的整数值。 |
|
|
|
2 字节整数。 |
|
|
|
4 字节整数。 |
|
|
|
8 字节整数,适用于主键、计数、金额分值等较大整数。 |
|
|
|
单精度浮点数。 |
|
|
|
双精度浮点数。 |
|
|
|
字符串类型,适用于文本、枚举值、分区字段等。 |
|
|
|
二进制类型,适用于字节数组等数据。 |
|
|
|
二进制大对象类型。 |
|
|
|
日期类型,不包含时分秒。 |
|
|
|
时间戳类型,精度 |
|
|
|
带时区语义的时间戳类型。 |
|
|
|
定点小数, |
|
|
|
数组类型,元素类型可为基础类型或复杂类型,例如 |
|
|
|
键值对集合类型,例如 |
|
|
|
结构体类型,用于表示嵌套字段,例如 |
建表示例
CREATE TABLE demo_db.type_demo (
c_boolean BOOLEAN,
c_tinyint TINYINT,
c_smallint SMALLINT,
c_int INT,
c_bigint BIGINT,
c_float FLOAT,
c_double DOUBLE,
c_decimal DECIMAL(10, 2),
c_string STRING,
c_binary BINARY(4),
c_date DATE,
c_timestamp TIMESTAMP(3),
c_array ARRAY<STRING>,
c_map MAP(STRING, BIGINT),
c_struct STRUCT<city STRING, zip BIGINT>
);
常见问题
查询超时怎么办?
优先添加 LIMIT、分区过滤或更精确的 WHERE 条件。
为什么查询语句自动只返回部分行?
SQL 探查默认对查询类语句应用返回行数限制,默认值为 1000。如需返回更多数据,请显式设置 LIMIT,最大不超过 10000。
为什么部分 DDL 执行失败?
不同 DDL 语句可能受底层执行引擎、Catalog 类型或表类型限制。建议先在测试库或测试表中验证,再用于正式数据对象。