Lakehouse 批量插入数据指南
概述
向表中插入数据是数据仓库建设的基础操作。云器 Lakehouse 支持多种数据插入方式,包括单行插入、多行插入、查询结果插入和覆盖插入。本指南按业务场景分类,帮助你快速掌握高效的数据插入方法。
涉及的 SQL 命令
| 命令 | 用途 | 适用场景 |
|---|
INSERT INTO ... VALUES
INSERT INTO ... VALUES | 插入字面量数据 | 测试数据、配置表、少量记录 |
INSERT INTO ... SELECT
INSERT INTO ... SELECT | 插入查询结果 | ETL 数据流转、批量导入 |
INSERT OVERWRITE
INSERT OVERWRITE | 覆盖写入 | 刷新分区数据、重建表数据 |
前置准备
以下示例使用模拟的产品表
products
products
:
-- 创建测试表
CREATE TABLE IF NOT EXISTS products (
product_id INT,
product_name STRING,
category STRING,
price DOUBLE,
stock INT
);
单行与多行插入
使用
VALUES
VALUES
子句插入一行或多行数据。适合测试数据或小批量配置数据。
-- 插入单行数据
INSERT INTO products VALUES (1, 'iPhone 15', 'Phone', 8000, 100);
-- 插入多行数据
INSERT INTO products VALUES
(2, 'MacBook Pro', 'Laptop', 15000, 50),
(3, 'AirPods', 'Audio', 1200, 200);
结果验证:
SELECT * FROM products ORDER BY product_id;
| product_id | product_name | category | price | stock |
|---|
| 1 | iPhone 15 | Phone | 8000 | 100 |
| 2 | MacBook Pro | Laptop | 15000 | 50 |
| 3 | AirPods | Audio | 1200 | 200 |
⚠️ 注意:
VALUES
VALUES
方式适合 100 行以内的小数据量。大批量数据导入推荐使用
COPY INTO
COPY INTO
或
INSERT INTO ... SELECT
INSERT INTO ... SELECT
。
查询结果插入
使用
INSERT INTO ... SELECT
INSERT INTO ... SELECT
将查询结果批量插入目标表,是 ETL 流程中最常用的数据写入方式。
-- 创建目标表
CREATE TABLE IF NOT EXISTS phone_products (
product_id INT,
product_name STRING,
price DOUBLE
);
-- 从源表筛选并插入
INSERT INTO phone_products
SELECT product_id, product_name, price
FROM products
WHERE category = 'Phone';
结果验证:
SELECT * FROM phone_products;
| product_id | product_name | price |
|---|
| 1 | iPhone 15 | 8000 |
覆盖插入
使用
INSERT OVERWRITE
INSERT OVERWRITE
覆盖目标表(或分区)的现有数据。常用于每日数据刷新或重建某一分区。
-- 覆盖全表数据
INSERT OVERWRITE TABLE products
SELECT * FROM products WHERE stock > 0;
⚠️ 注意:> * 对于非分区表,
INSERT OVERWRITE
INSERT OVERWRITE
会清空整表数据后写入新数据。
- 对于分区表,
INSERT OVERWRITE
INSERT OVERWRITE
仅覆盖匹配的分区,其他分区不受影响。
指定列插入
当只需要插入部分列时,显式指定列名,未指定的列将使用默认值或
NULL
NULL
。
-- 仅插入部分列
INSERT INTO products (product_id, product_name, category)
VALUES (4, 'iPad Air', 'Tablet');
结果验证:
SELECT product_id, product_name, category, price, stock
FROM products
WHERE product_id = 4;
| product_id | product_name | category | price | stock |
|---|
| 4 | iPad Air | Tablet | NULL | NULL |
清理测试数据
完成插入验证后,建议清理测试表:
-- 删除测试表
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS phone_products;
💡 提示:Lakehouse 支持
UNDROP TABLE
UNDROP TABLE
,误删后可在保留期内恢复。
注意事项
- 大批量导入:超过万行的数据导入,推荐使用
COPY INTO
COPY INTO
从 Volume 导入,或使用数据同步任务。
- 类型匹配:
VALUES
VALUES
中的数据类型必须与表定义匹配。日期、时间、JSON 等类型需使用字面量语法(如 DATE '2024-06-01'
DATE '2024-06-01'
)。
- 动态表限制:Dynamic Table 不支持直接
INSERT INTO
INSERT INTO
,数据由上游表变更触发自动刷新。
- 事务性:单次
INSERT
INSERT
操作是原子的,要么全部成功,要么全部失败。
相关文档