4.4. 插入数据
INSERT 语句向表中插入新行。插入的行可以由值表达式或查询结果指定,跟标准的sql语法一致。
INSERT INTO table_identifier [ part_spec ] [ column_list ] { value_expr | query }
part_spec
可选,指定分区的键值对列表,多个用逗号分隔。可以使用类型文字(例如,date’2019-01-02’)。
语法: PARTITION (分区列名称 = 分区列值 [ , … ] )
column_list
可选,指定以逗号分隔的字段列表。
语法:(col_name1 [,column_name2, …])
所有指定的列都应该存在于表中,并且不能相互重复。它包括除静态分区列之外的所有列。字段列表的大小应与 VALUES 子句或查询中的数据大小完全相同。
value_expr
指定要插入的值。可以插入显式指定的值或 NULL。必须使用逗号分隔子句中的每个值。可以指定多于一组的值来插入多行。
语法:VALUES ( { 值 | NULL } [ , … ] ) [ , ( … ) ]
注意:将 Nullable 字段写入 Not-null 字段
不能将另一个表的可为空列插入到一个表的非空列中。Spark可以使用nvl函数来处理,比如A表的key1是not null,B表的key2是nullable:
INSERT INTO A key1 SELECT nvl(key2, ) FROM B
案例:
INSERT INTO tests VALUES(1,1,'order','2023-07-01','1'), (2,2,'pay','2023-07-01','2'); INSERT INTO tests_p SELECT * from tests;
4.5. 查询数据
就像所有其他表一样,Paimon 表可以使用 SELECT 语句进行查询。
Paimon的批量读取返回表快照中的所有数据。默认情况下,批量读取返回最新快照。
4.5.1 时间旅行
可以在查询中使用 VERSION AS OF 和 TIMESTAMP AS OF 来进行时间旅行。
1)读取指定id的快照
SELECT * FROM tests VERSION AS OF 1; SELECT * FROM tests VERSION AS OF 2;
2)读取指定时间戳的快照
-- 查看快照信息 SELECT * FROM tests&snapshots; SELECT * FROM tests TIMESTAMP AS OF '2023-07-03 15:34:20.123'; -- 时间戳指定到秒(向上取整) SELECT * FROM tests TIMESTAMP AS OF 1688369660;
3)读取指定标签
SELECT * FROM tests VERSION AS OF 'my-tag';
4.5.2 增量查询
读取开始快照(不包括)和结束快照之间的增量更改。例如,“3,5”表示快照 3 和快照 5 之间的更改:
spark.read() .format(“paimon”) .option(“incremental-between”, “3,5”) .load(“path/to/table”)
4.6 系统表
系统表包含有关每个表的元数据和信息,例如创建的快照和使用的选项。用户可以通过批量查询访问系统表。
4.6.1 快照表 Snapshots Table
通过snapshots表可以查询表的快照历史信息,包括快照中发生的记录数。Spark中使用需要反引号表名$系统表名
。
SELECT * FROM tests$snapshots
;
通过查询快照表,可以了解该表的提交和过期信息以及数据的时间旅行。
4.6.2 模式表 Schemas Table
通过schemas表可以查询该表的历史schema。
SELECT * FROM tests$schemas
;
可以连接快照表和模式表以获取给定快照的字段。
SELECT s.snapshot_id, t.schema_id, t.fields FROM tests$snapshots s JOIN tests$schemas t ON s.schema_id=t.schema_id where s.snapshot_id=3;
4.6.3 选项表 Options Table
可以通过选项表查询DDL中指定的表的选项信息。未显示的选项将是默认值。
SELECT * FROM tests$options
;
4.6.4 审计日志表 Audit log Table
如果需要审计表的changelog,可以使用audit_log系统表。通过audit_log表,获取表增量数据时可以获取rowkind列。您可以利用该栏目进行过滤等操作来完成审核。
rowkind 有四个值:
+I:插入操作。
-U:使用更新行的先前内容进行更新操作。
+U:使用更新行的新内容进行更新操作。
-D:删除操作。
SELECT * FROM tests$audit_log
;
4.6.5 文件表 Files Table
可以查询特定快照表的文件。
– 查询最新快照的文件
SELECT * FROM tests$files
;
4.6.6 标签表 Tags Table
通过tags表可以查询表的标签历史信息,包括基于哪些快照进行标签以及快照的一些历史信息。您还可以通过名称获取所有标签名称和时间旅行到特定标签的数据。
SELECT * FROM tests$tags
;