使用dlt项目从文件系统或云存储加载数据教程
前言
在现代数据工程中,从各种文件系统或云存储服务加载数据是一个常见需求。dlt项目(Data Load Tool)提供了一个高效、灵活的解决方案来处理这种场景。本教程将详细介绍如何使用dlt从本地文件系统或云存储(如AWS S3、Google Cloud Storage等)加载JSON、CSV、Parquet等格式的数据文件。
准备工作
在开始之前,请确保您已满足以下条件:
- 已安装Python 3.9或更高版本
- 已设置Python虚拟环境
- 已安装dlt库(可通过pip安装)
项目初始化
dlt提供了便捷的CLI命令来快速初始化项目:
dlt init filesystem duckdb
这个命令会创建一个从文件系统加载数据到DuckDB数据库的项目模板。项目结构包含:
filesystem_pipeline.py
:主脚本文件,定义数据管道requirements.txt
:项目依赖文件.dlt/
目录:包含配置文件secrets.toml
:存储敏感信息如API密钥config.toml
:存储项目配置
核心概念解析
文件系统资源
dlt的文件系统源提供了两个主要构建块:
- 文件列表资源:列出目录或存储桶中的文件
- 文件读取器:读取文件内容并生成记录
转换器(Transformer)
转换器是一种特殊类型的资源,它处理来自另一个资源的记录。在文件系统场景中,转换器接收FileItem
对象并将其转换为多条记录。
创建基础管道
以下是一个从Google Cloud Storage加载CSV文件的示例:
import dlt
from dlt.sources.filesystem import filesystem, read_csv
# 初始化文件系统资源
files = filesystem(bucket_url="gs://filesystem-tutorial", file_glob="encounters*.csv")
# 创建转换器管道
reader = (files | read_csv()).with_name("encounters")
# 创建dlt管道
pipeline = dlt.pipeline(
pipeline_name="hospital_data_pipeline",
dataset_name="hospital_data",
destination="duckdb"
)
# 运行管道
info = pipeline.run(reader)
print(info)
这段代码完成了以下工作:
- 初始化文件系统资源,指定存储桶URL和文件匹配模式
- 将文件列表通过管道传递给CSV读取器
- 创建dlt管道并运行
配置详解
云存储认证
dlt支持多种认证方式,以下是Google Cloud Storage的配置示例(使用TOML格式):
# secrets.toml
[sources.filesystem.credentials]
client_email = "your-service-account@project.iam.gserviceaccount.com"
project_id = "your-project-id"
private_key = "-----BEGIN PRIVATE KEY-----\n..."
# config.toml
[sources.filesystem]
bucket_url="gs://your-bucket-name"
认证方式选择
dlt支持多种认证方式:
- 服务账号密钥(如上例)
- 环境变量
- 默认凭证
- 身份联合认证
数据加载策略
dlt提供了三种数据写入策略:
- 追加(append):默认方式,向目标表追加数据
- 替换(replace):完全替换目标表中的数据
- 合并(merge):基于主键合并新旧数据
合并数据示例
reader = (files | read_csv()).with_name("encounters")
reader.apply_hints(primary_key="id")
info = pipeline.run(reader, write_disposition="merge")
增量加载
对于频繁更新的数据源,增量加载可以显著提高效率:
# 仅加载修改过的文件
files.apply_hints(incremental=dlt.sources.incremental("modification_date"))
# 仅加载特定时间戳后的记录
reader.apply_hints(incremental=dlt.sources.incremental("STOP"))
数据探索
dlt内置了数据浏览器,可通过以下命令启动:
pip install streamlit
dlt pipeline hospital_data_pipeline show
这将打开一个交互式界面,您可以:
- 浏览加载的数据
- 执行查询
- 查看管道执行详情
高级技巧
处理不同文件格式
dlt支持多种文件格式,使用方法类似:
from dlt.sources.filesystem import read_jsonl, read_parquet
# JSONL文件
json_reader = (files | read_jsonl()).with_name("json_data")
# Parquet文件
parquet_reader = (files | read_parquet()).with_name("parquet_data")
自定义文件处理
对于特殊格式的文件,您可以创建自定义处理器:
@dlt.resource
def custom_file_processor(file_item):
# 自定义处理逻辑
for record in process_file(file_item):
yield record
总结
通过本教程,您已经学会了:
- 如何使用dlt从文件系统和云存储加载数据
- 配置不同云存储服务的认证
- 实现增量加载和合并策略
- 探索和分析加载的数据
dlt的强大功能使数据加载过程变得简单而高效,无论是处理本地文件还是云存储中的大数据集。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考