数据探查 SQL 语法说明

更新时间:
复制 MD 格式

本文介绍数据探查中 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.tablesinformation_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
);

动态参数语句

可以使用 SETRESET 在一次提交中临时设置 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 类型

说明

BOOLEAN

BooleanType

布尔类型,取值为 TRUEFALSENULL

TINYINT

TinyIntType

1 字节整数,适用于较小范围的整数值。

SMALLINT

SmallIntType

2 字节整数。

INT / INTEGER

IntType

4 字节整数。

BIGINT

BigIntType

8 字节整数,适用于主键、计数、金额分值等较大整数。

FLOAT / REAL

FloatType

单精度浮点数。

DOUBLE / DOUBLE PRECISION

DoubleType

双精度浮点数。

VARCHAR / TEXT / STRING / CHAR

VarCharType

字符串类型,适用于文本、枚举值、分区字段等。

BINARY / VARBINARY / BYTEA

VarBinaryType

二进制类型,适用于字节数组等数据。

BLOB

BlobType

二进制大对象类型。

DATE

DateType

日期类型,不包含时分秒。

TIMESTAMP(p)

TimestampType

时间戳类型,精度 p 支持 0369,默认值为 3

TIMESTAMP WITH TIME ZONE

LocalZonedTimestampType

带时区语义的时间戳类型。

DECIMAL(p, s)

DecimalType

定点小数,p 表示总位数,s 表示小数位数。

ARRAY<element>

ArrayType

数组类型,元素类型可为基础类型或复杂类型,例如 ARRAY<INT>

MAP(key, value)

MapType

键值对集合类型,例如 MAP(STRING, INT)

STRUCT<field TYPE, ...>

RowType

结构体类型,用于表示嵌套字段,例如 STRUCT<city STRING, zip INT>

建表示例

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 类型或表类型限制。建议先在测试库或测试表中验证,再用于正式数据对象。