Snowflake 是一款功能强大的云端数据仓库平台,帮助组织高效地存储、管理和分析数据。与需要复杂硬件部署的传统数据仓库不同,Snowflake 完全运行在云端,使企业能够根据需要更轻松地扩展数据业务。
在 Snowflake 中创建表是一项奠基性的技能,是数据管理的基础。表是您存放结构化数据的地方,便于运行查询、生成报表,并从信息中获得有价值的洞见。无论您处理的是客户数据、销售数据,还是分析结果,掌握如何在 Snowflake 中创建和管理表都至关重要。
在本教程中,您将学习在 Snowflake 中创建表所需的一切。我们将介绍不同类型的表,提供分步示例,并分享表设计的最佳实践。结束后,您将能够自信地选择适合自己需求的表类型,并创建符合行业标准、兼顾性能与可维护性的表。
了解 Snowflake 中的表类型
在深入讲解创建表的代码示例之前,先来了解 Snowflake 中的不同表类型。它们分别服务于不同目的,并在数据持久性、可访问性与存储位置等方面具有各自的特性。
永久表
永久表是 Snowflake 中的标准表类型。它们会一直存在,直到被显式删除,并存储在 Snowflake 的内部存储中。此类表非常适合存放需要长期保留、并在多个会话中访问的核心业务数据。永久表中的数据在会话之间保持不变,授权用户均可访问。
临时表
临时表是会话级表,会在当前会话结束时自动删除。它们可用作中间处理步骤的工作表,帮助组织复杂的数据转换,同时不占用永久存储。临时表中的数据仅对创建它们的会话可见,并在会话关闭时自动清理。
外部表
外部表提供一种查询 Snowflake 存储之外数据的方式。它们充当元数据层,映射到诸如 AWS S3 或 Azure Blob Storage 等外部存储位置中的数据。外部表不会摄取数据,而是创建数据引用,使您能够直接查询外部数据。当需要让数据保留在源位置,或需要频繁从外部系统更新时,这种方式尤为有价值。
动态表
动态表是 Snowflake 中一项强大的功能,可自动维护查询结果的最新状态。它们类似于物化视图,会根据底层源表的变化自动刷新。当您创建动态表时,通过一个 SELECT 语句进行定义,Snowflake 会自动管理刷新过程,确保数据保持最新。
动态表特别适用于:
构建无需手动刷新的实时仪表板
维护会自动更新的源数据汇总或转换版本
创建依赖型数据模型,使下游表能反映上游变更
通过预计算复杂转换来优化查询性能
动态表的关键特性包括:
可配置的刷新间隔(1 分钟至 24 小时)
对源表的自动依赖跟踪
目标滞后时间设置以控制数据新鲜度
增量处理以尽量降低计算成本
内置监控与优化能力
每种表类型在数据架构中都有其独特用途。永久表构筑数据仓库的基础,临时表支持数据处理工作流,外部表实现与外部数据源的集成,动态表提供自动化、近实时的数据转换。
对比 Snowflake 表类型
下表为不同类型的 Snowflake 表提供了简明的速查对照:
Table Type
Persistence
Visibility
Best For
Permanent
Until dropped
Any session
Core business data
Temporary
Session-only
Same session
Intermediate transformations
External
External storage
Any session
Querying external data (e.g., S3)
Dynamic
Auto-refreshing
Any session
Real-time analytics
创建表:设置 Snowflake 环境
在运行本教程中的示例之前,您需要访问一个 Snowflake 环境。以下是连接并运行 Snowflake 命令的几种方式:
1. Snowflake 网页界面(Snowsight)
最简单的上手方式是通过 Snowflake 的网页界面:
登录您的 Snowflake 账户
进入 Worksheets
创建新工作表以运行 SQL 命令
2. Snowflake CLI(命令行工具)
若需命令行访问:
安装 Snowflake CLI
使用以下方式连接:
snowsql -a < account> -u < username> -d < database> -w < warehouse> 技术支持
您可以在以下位置找到 Snowflake 账户凭据:
账户 URL:在欢迎邮件或账户设置中查看
用户名:在账户设置期间提供
数据库:由您的管理员创建或分配
仓库(Warehouse):由您的管理员创建或分配
出于安全考虑,切勿共享或提交这些凭据。请将其安全地存储在环境变量或配置文件中。
3. Python 连接
如果您使用 Python,可以使用 snowflake-connector-python 库:
import snowflake. connector
conn = snowflake. connector. connect(
user= 'your_username' ,
password= 'your_password' ,
account= 'your_account' ,
warehouse= 'your_warehouse' ,
database= 'your_database' ,
schema= 'your_schema'
)
cur = conn. cursor( )
cur. execute( "SELECT current_version()" ) 技术支持
重要的安全提示:
切勿将凭据直接存放在代码中
使用环境变量或安全的密钥管理
生产环境建议使用密钥对认证
遵循您组织的安全策略
环境就绪后,让我们开始创建表!
在 Snowflake 中创建表:分步示例
示例 1:创建一个简单的 Snowflake 表
我们来创建一个用于存储客户信息的表。该示例展示了包含不同数据类型与约束的基础建表方式。
CREATE OR REPLACE TABLE customers (
customer_id INTEGER PRIMARY KEY ,
first_name VARCHAR ( 50 ) NOT NULL ,
last_name VARCHAR ( 50 ) NOT NULL ,
email VARCHAR ( 100 ) UNIQUE ,
date_of_birth DATE ,
created_at TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP ( )
) ; 技术支持
此示例的要点:
CREATE OR REPLACE TABLE —— 创建新表,若已存在则替换
PRIMARY KEY —— 确保每条记录唯一标识
NOT NULL —— 禁止必填字段为空
UNIQUE —— 确保邮箱地址不重复
TIMESTAMP_NTZ —— 不含时区的时间戳
DEFAULT —— 自动设置创建时间戳
示例 2:创建临时表
临时表非常适合中间数据处理。以下示例创建一个用于分析客户订单的临时表:
CREATE OR REPLACE TEMPORARY TABLE temp_order_analysis (
order_date DATE ,
total_orders INTEGER ,
total_revenue DECIMAL ( 18 , 2 )
)
AS
SELECT
DATE_TRUNC( 'day' , order_date) as order_date,
COUNT ( * ) as total_orders,
SUM ( order_amount) as total_revenue
FROM orders
GROUP BY 1 ; 技术支持
关于临时表的要点:
TEMPORARY 关键字表示该表仅在当前会话内存在。这意味着其他用户无法查看或访问此表。
使用 CREATE TABLE AS(CTAS)可将表定义与 SELECT 语句结合,在一步内创建并填充表。
会话结束时临时表会自动删除,有助于在无需手动清理的情况下保持数据库整洁。
临时表适合在复杂的数据转换或分析流程中存放中间结果。
示例 3:在 Snowflake 中创建外部表
以下示例展示如何创建一个从云存储桶中的文件读取数据的外部表:
CREATE OR REPLACE FILE FORMAT my_csv_format
TYPE = CSV
FIELD_DELIMITER = ','
SKIP_HEADER = 1
NULL_IF = ( 'NULL' , 'null' ) ;
CREATE OR REPLACE STAGE my_external_stage
URL = 's3://my-bucket/data/'
CREDENTIALS = ( AWS_KEY_ID = 'xxx' AWS_SECRET_KEY = 'xxx' ) ;
CREATE OR REPLACE EXTERNAL TABLE ext_customer_data (
customer_id VARCHAR AS ( VALUE :c1::VARCHAR ) ,
purchase_date DATE AS ( VALUE :c2::DATE ) ,
product_id VARCHAR AS ( VALUE :c3::VARCHAR ) ,
amount DECIMAL ( 10 , 2 ) AS ( VALUE :c4::DECIMAL ( 10 , 2 ) )
)
WITH LOCATION = @my_external_stage / customers/
FILE_FORMAT = my_csv_format
PATTERN = '.*[.]csv' ; 技术支持
第一条语句定义了文件格式规范,告知 Snowflake 如何解析外部 CSV 文件,包括分隔符、表头处理以及 NULL 值表示。
第二条语句创建了一个 stage 对象,使用所提供的凭据与外部云存储(此处为 S3)建立连接。该 stage 充当访问外部数据文件的参照点。
第三条语句创建外部表本身,使用带 AS 子句的列定义,将来自 CSV 的原始字符串数据显式转换为合适的 Snowflake 数据类型。WITH LOCATION 子句指向 stage 内文件所在的具体路径。
PATTERN 参数通过正则匹配筛选应包含的文件,确保仅处理 CSV 文件。
运行此外部表创建语句的先决条件:
1. 访问具有以下权限的 Snowflake 账户:
2. 具备有效的 AWS 凭据(AWS_KEY_ID 与 AWS_SECRET_KEY),并拥有以下权限:
3. 源数据要求:
CSV 文件存放在 S3 存储桶中
文件遵循包含四列的一致格式
列数据与指定类型匹配:
customer_id 为字符串
purchase_date 为日期
product_id 为字符串
amount 为十进制数
4. 网络连通性:
可访问 AWS S3 的网络
正确的安全组与防火墙设置
5. 计算资源:
示例 4:创建动态表
以下示例创建一个动态表,用于维护销售数据的最新汇总:
CREATE OR REPLACE DYNAMIC TABLE daily_sales_summary
TARGET_LAG = '20 minutes'
WAREHOUSE = 'COMPUTE_WH'
AS
SELECT
DATE_TRUNC( 'day' , sale_timestamp) as sale_date,
product_category,
SUM ( sale_amount) as total_sales,
COUNT ( DISTINCT customer_id) as unique_customers
FROM sales_transactions
GROUP BY 1 , 2 ; 技术支持
TARGET_LAG 参数设置为 “20 minutes”,表示从源表更新到动态表反映变更的最大允许延迟。这确保了在该时间窗口内的数据新鲜度。
WAREHOUSE 参数指定用于定期刷新动态表的计算资源(此处为 COMPUTE_WH)。该仓库必须具备足够的能力来处理刷新操作。
当底层的 sales_transactions 表发生变化时,动态表会自动更新其内容,无需人工干预。这提供了近实时的分析能力。
通过按产品类别维护预聚合的每日销售汇总,动态表相比从原始交易数据按需计算这些指标,能够更快地查询。这提升了报告与分析场景的查询性能。
上述每个示例展示了您在真实应用中可能遇到的不同建表场景。请根据具体需求调整列名、数据类型与其他参数。
在 Snowflake 中创建表的最佳实践
下面来看看在 Snowflake 中创建表时应遵循的一些最佳实践,以确保可维护性、性能与数据质量。
1. 命名规范
始终为表与列使用清晰、一致的名称:
CREATE TABLE customer_orders (
order_id INTEGER ,
customer_email VARCHAR ,
order_date DATE
) ;
CREATE TABLE Orders123 (
ID INTEGER ,
email VARCHAR ,
dt DATE
) ; 技术支持
命名提示:
使用小写字母与下划线(snake_case)
避免空格与特殊字符
名称应具描述性但不宜过长
表名使用单数形式(如 customer 而非 customers)
为不同环境添加前缀(dev_、test_、prod_)
2. 列的数据类型
选择合适的数据类型可节省存储并提升性能:
CREATE TABLE products (
product_id INTEGER ,
price DECIMAL ( 10 , 2 ) ,
name VARCHAR ( 100 ) ,
description TEXT ,
is_active BOOLEAN
) ; 技术支持
常用数据类型:
NUMBER/INTEGER:用于整数
DECIMAL/NUMERIC:用于精确的小数(尤其是金额)
VARCHAR:用于有已知最大长度的文本
TEXT:用于无限长度文本
TIMESTAMP_NTZ:用于日期与时间(无时区)
BOOLEAN:用于布尔值
3. 使用聚簇键(Clustering Keys)
添加聚簇键以提升查询性能:
CREATE TABLE sales (
sale_date DATE ,
store_id INTEGER ,
product_id INTEGER ,
amount DECIMAL ( 10 , 2 )
)
CLUSTER BY ( sale_date, store_id) ; 技术支持
何时使用聚簇:
对于大型表(超过 100 万行)
在经常用于过滤或关联的列上
通常是日期列加上 1–2 个其他列
不要在基数过高的列上进行聚簇
4. 添加表约束
使用约束保持数据整洁:
CREATE TABLE users (
user_id INTEGER PRIMARY KEY ,
email VARCHAR ( 255 ) UNIQUE ,
username VARCHAR ( 50 ) NOT NULL ,
age INTEGER CHECK ( age >= 18 )
) ; 技术支持
重要的约束:
PRIMARY KEY:用于唯一标识符
FOREIGN KEY:用于连接表之间的关系
NOT NULL:用于必填字段
UNIQUE:用于不允许重复的字段
CHECK:用于简单的数据校验
5. 常见错误避免
不要这样做:
CREATE TABLE orders (
date VARCHAR ,
amount VARCHAR ( 10 ) ,
status text
) ;
技术支持
推荐这样做:
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY ,
order_date DATE ,
amount DECIMAL ( 10 , 2 ) ,
status VARCHAR ( 20 )
) ;
技术支持
改进版本通过主键确保数据完整性,正确使用日期与数字的数据类型以支持高效过滤与计算,并在列定义上保持一致性,从而提升可读性与兼容性。
6. 性能提示
在 Snowflake 中优化表的性能可显著提升查询速度并降低存储成本。遵循以下最佳实践,确保您的表高效且可扩展。
尽量将超大表拆分为更小的专题表
使用 COMMENT 添加列描述
设置自动数据清理规则
用真实数据验证您的表设计
监控表的使用情况并按需调整
7. 安全最佳实践
完善的安全措施对于保护敏感数据与控制访问至关重要。实施以下最佳实践,以防止未授权访问和数据泄露,保障您的 Snowflake 环境安全。
始终设置合适的访问权限
按需使用行级安全
加密敏感列
清楚记录各类访问权限
定期审查访问模式
请记住:一个设计良好的表会让后续工作事半功倍。创建之前务必花时间规划表结构!
结语
本教程涵盖了在 Snowflake 中创建表的要点,包括:
不同类型的表(永久表、临时表、外部表与动态表)
为每种表提供的分步创建示例
表设计与管理的最佳实践
需要避免的常见陷阱
这些知识为您在 Snowflake 中构建高效且可扩展的数据解决方案打下了基础。
后续学习
如需进一步提升 Snowflake 技能,请查看以下资源:
1. 互动课程:
2. 系统教程:
3. 职业发展资源:
别忘了,最好的学习方式就是实践。开始创建表,尝试不同类型,并构建真实项目。遇到挑战时,回看这些资源并持续探索 Snowflake 的新功能。
Snowflake 是一款功能强大的云端数据仓库平台,帮助组织高效地存储、管理和分析数据。与需要复杂硬件部署的传统数据仓库不同,Snowflake 完全运行在云端,使企业能够根据需要更轻松地扩展数据业务。
在 Snowflake 中创建表是一项奠基性的技能,是数据管理的基础。表是您存放结构化数据的地方,便于运行查询、生成报表,并从信息中获得有价值的洞见。无论您处理的是客户数据、销售数据,还是分析结果,掌握如何在 Snowflake 中创建和管理表都至关重要。
在本教程中,您将学习在 Snowflake 中创建表所需的一切。我们将介绍不同类型的表,提供分步示例,并分享表设计的最佳实践。结束后,您将能够自信地选择适合自己需求的表类型,并创建符合行业标准、兼顾性能与可维护性的表。
了解 Snowflake 中的表类型
在深入讲解创建表的代码示例之前,先来了解 Snowflake 中的不同表类型。它们分别服务于不同目的,并在数据持久性、可访问性与存储位置等方面具有各自的特性。
永久表
永久表是 Snowflake 中的标准表类型。它们会一直存在,直到被显式删除,并存储在 Snowflake 的内部存储中。此类表非常适合存放需要长期保留、并在多个会话中访问的核心业务数据。永久表中的数据在会话之间保持不变,授权用户均可访问。
临时表
临时表是会话级表,会在当前会话结束时自动删除。它们可用作中间处理步骤的工作表,帮助组织复杂的数据转换,同时不占用永久存储。临时表中的数据仅对创建它们的会话可见,并在会话关闭时自动清理。
外部表
外部表提供一种查询 Snowflake 存储之外数据的方式。它们充当元数据层,映射到诸如 AWS S3 或 Azure Blob Storage 等外部存储位置中的数据。外部表不会摄取数据,而是创建数据引用,使您能够直接查询外部数据。当需要让数据保留在源位置,或需要频繁从外部系统更新时,这种方式尤为有价值。
动态表
动态表是 Snowflake 中一项强大的功能,可自动维护查询结果的最新状态。它们类似于物化视图,会根据底层源表的变化自动刷新。当您创建动态表时,通过一个 SELECT 语句进行定义,Snowflake 会自动管理刷新过程,确保数据保持最新。
动态表特别适用于:
动态表的关键特性包括:
每种表类型在数据架构中都有其独特用途。永久表构筑数据仓库的基础,临时表支持数据处理工作流,外部表实现与外部数据源的集成,动态表提供自动化、近实时的数据转换。
对比 Snowflake 表类型
下表为不同类型的 Snowflake 表提供了简明的速查对照:
Table Type
Persistence
Visibility
Best For
Permanent
Until dropped
Any session
Core business data
Temporary
Session-only
Same session
Intermediate transformations
External
External storage
Any session
Querying external data (e.g., S3)
Dynamic
Auto-refreshing
Any session
Real-time analytics
创建表:设置 Snowflake 环境
在运行本教程中的示例之前,您需要访问一个 Snowflake 环境。以下是连接并运行 Snowflake 命令的几种方式:
1. Snowflake 网页界面(Snowsight)
最简单的上手方式是通过 Snowflake 的网页界面:
2. Snowflake CLI(命令行工具)
若需命令行访问:
您可以在以下位置找到 Snowflake 账户凭据:
出于安全考虑,切勿共享或提交这些凭据。请将其安全地存储在环境变量或配置文件中。
3. Python 连接
如果您使用 Python,可以使用
snowflake-connector-python库:重要的安全提示:
环境就绪后,让我们开始创建表!
在 Snowflake 中创建表:分步示例
示例 1:创建一个简单的 Snowflake 表
我们来创建一个用于存储客户信息的表。该示例展示了包含不同数据类型与约束的基础建表方式。
此示例的要点:
CREATE OR REPLACE TABLE—— 创建新表,若已存在则替换PRIMARY KEY—— 确保每条记录唯一标识NOT NULL—— 禁止必填字段为空UNIQUE—— 确保邮箱地址不重复TIMESTAMP_NTZ—— 不含时区的时间戳DEFAULT—— 自动设置创建时间戳示例 2:创建临时表
临时表非常适合中间数据处理。以下示例创建一个用于分析客户订单的临时表:
关于临时表的要点:
TEMPORARY关键字表示该表仅在当前会话内存在。这意味着其他用户无法查看或访问此表。CREATE TABLE AS(CTAS)可将表定义与 SELECT 语句结合,在一步内创建并填充表。示例 3:在 Snowflake 中创建外部表
以下示例展示如何创建一个从云存储桶中的文件读取数据的外部表:
第一条语句定义了文件格式规范,告知 Snowflake 如何解析外部 CSV 文件,包括分隔符、表头处理以及 NULL 值表示。
第二条语句创建了一个 stage 对象,使用所提供的凭据与外部云存储(此处为 S3)建立连接。该 stage 充当访问外部数据文件的参照点。
第三条语句创建外部表本身,使用带 AS 子句的列定义,将来自 CSV 的原始字符串数据显式转换为合适的 Snowflake 数据类型。WITH LOCATION 子句指向 stage 内文件所在的具体路径。
PATTERN 参数通过正则匹配筛选应包含的文件,确保仅处理 CSV 文件。
运行此外部表创建语句的先决条件:
1. 访问具有以下权限的 Snowflake 账户:
2. 具备有效的 AWS 凭据(
AWS_KEY_ID与AWS_SECRET_KEY),并拥有以下权限:3. 源数据要求:
customer_id为字符串purchase_date为日期product_id为字符串amount为十进制数4. 网络连通性:
5. 计算资源:
示例 4:创建动态表
以下示例创建一个动态表,用于维护销售数据的最新汇总:
TARGET_LAG参数设置为 “20 minutes”,表示从源表更新到动态表反映变更的最大允许延迟。这确保了在该时间窗口内的数据新鲜度。WAREHOUSE参数指定用于定期刷新动态表的计算资源(此处为COMPUTE_WH)。该仓库必须具备足够的能力来处理刷新操作。当底层的
sales_transactions表发生变化时,动态表会自动更新其内容,无需人工干预。这提供了近实时的分析能力。通过按产品类别维护预聚合的每日销售汇总,动态表相比从原始交易数据按需计算这些指标,能够更快地查询。这提升了报告与分析场景的查询性能。
上述每个示例展示了您在真实应用中可能遇到的不同建表场景。请根据具体需求调整列名、数据类型与其他参数。
在 Snowflake 中创建表的最佳实践
下面来看看在 Snowflake 中创建表时应遵循的一些最佳实践,以确保可维护性、性能与数据质量。
1. 命名规范
始终为表与列使用清晰、一致的名称:
命名提示:
dev_、test_、prod_)2. 列的数据类型
选择合适的数据类型可节省存储并提升性能:
常用数据类型:
NUMBER/INTEGER:用于整数DECIMAL/NUMERIC:用于精确的小数(尤其是金额)VARCHAR:用于有已知最大长度的文本TEXT:用于无限长度文本TIMESTAMP_NTZ:用于日期与时间(无时区)BOOLEAN:用于布尔值3. 使用聚簇键(Clustering Keys)
添加聚簇键以提升查询性能:
何时使用聚簇:
4. 添加表约束
使用约束保持数据整洁:
重要的约束:
PRIMARY KEY:用于唯一标识符FOREIGN KEY:用于连接表之间的关系NOT NULL:用于必填字段UNIQUE:用于不允许重复的字段CHECK:用于简单的数据校验5. 常见错误避免
不要这样做:
推荐这样做:
改进版本通过主键确保数据完整性,正确使用日期与数字的数据类型以支持高效过滤与计算,并在列定义上保持一致性,从而提升可读性与兼容性。
6. 性能提示
在 Snowflake 中优化表的性能可显著提升查询速度并降低存储成本。遵循以下最佳实践,确保您的表高效且可扩展。
7. 安全最佳实践
完善的安全措施对于保护敏感数据与控制访问至关重要。实施以下最佳实践,以防止未授权访问和数据泄露,保障您的 Snowflake 环境安全。
请记住:一个设计良好的表会让后续工作事半功倍。创建之前务必花时间规划表结构!
结语
本教程涵盖了在 Snowflake 中创建表的要点,包括:
这些知识为您在 Snowflake 中构建高效且可扩展的数据解决方案打下了基础。
后续学习
如需进一步提升 Snowflake 技能,请查看以下资源:
1. 互动课程:
2. 系统教程:
3. 职业发展资源:
别忘了,最好的学习方式就是实践。开始创建表,尝试不同类型,并构建真实项目。遇到挑战时,回看这些资源并持续探索 Snowflake 的新功能。