dlt项目入门指南:从基础到高级的数据加载示例
什么是dlt
dlt是一个现代化的Python数据加载工具库,它简化了从各种数据源提取数据并加载到目标存储的过程。dlt提供了一种声明式的方式来定义数据管道,支持多种数据源和目标,使数据工程师能够快速构建可靠的数据集成解决方案。
基础使用示例
快速开始
最基本的dlt使用方式是从Python数据结构直接加载数据:
import dlt
data = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
pipeline = dlt.pipeline(
pipeline_name="quick_start",
destination="duckdb",
dataset_name="mydata"
)
load_info = pipeline.run(data, table_name="users")
print(load_info)
这段代码展示了如何:
- 定义一个简单的数据列表
- 创建dlt管道,指定目标为DuckDB数据库
- 运行管道加载数据
- 输出加载信息
从JSON文件加载
dlt可以轻松处理JSON格式的数据:
import dlt
from dlt.common import json
with open("./assets/json_file.json", "rb") as file:
data = json.load(file)
pipeline = dlt.pipeline(
pipeline_name="from_json",
destination="duckdb",
dataset_name="mydata",
)
load_info = pipeline.run([data], table_name="json_data")
注意点:
- 如果JSON文件包含对象列表,可以直接传递而不需要额外封装
- 使用dlt内置的json模块处理文件读取
从常见数据源加载
处理CSV数据
结合pandas可以方便地处理CSV数据:
import dlt
import pandas as pd
csv_url = "https://example.com/data.csv"
df = pd.read_csv(csv_url)
data = df.to_dict(orient="records")
pipeline = dlt.pipeline(
pipeline_name="from_csv",
destination="duckdb",
dataset_name="mydata",
)
load_info = pipeline.run(data, table_name="natural_disasters")
从API获取数据
dlt内置了requests辅助模块,简化API调用:
import dlt
from dlt.sources.helpers import requests
url = "https://api.example.com/issues"
response = requests.get(url)
response.raise_for_status()
pipeline = dlt.pipeline(
pipeline_name="from_api",
destination="duckdb",
dataset_name="github_data",
)
load_info = pipeline.run(response.json(), table_name="issues")
从数据库加载
使用SQLAlchemy连接各种数据库:
import dlt
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://user@host:port/db")
with engine.connect() as conn:
rows = conn.execution_options(yield_per=100).exec_driver_sql(
"SELECT * FROM table LIMIT 1000"
)
pipeline = dlt.pipeline(
pipeline_name="from_database",
destination="duckdb",
dataset_name="db_data",
)
load_info = pipeline.run(map(lambda row: dict(row._mapping), rows), table_name="data")
高级功能
数据替换策略
使用write_disposition="replace"
可以完全替换目标表中的数据:
data = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
pipeline = dlt.pipeline(
pipeline_name="replace_data",
destination="duckdb",
dataset_name="mydata",
)
load_info = pipeline.run(data, table_name="users", write_disposition="replace")
增量加载
dlt提供了强大的增量加载功能:
@dlt.resource(table_name="issues", write_disposition="append")
def get_issues(created_at=dlt.sources.incremental("created_at")):
url = f"https://api.example.com/issues?since={created_at.last_value}"
response = requests.get(url)
yield response.json()
合并更新数据
使用合并策略更新已有记录:
@dlt.resource(
table_name="issues",
write_disposition="merge",
primary_key="id",
)
def get_issues(updated_at=dlt.sources.incremental("updated_at")):
url = f"https://api.example.com/issues?since={updated_at.last_value}"
response = requests.get(url)
yield response.json()
动态表分配
根据数据内容动态决定目标表:
@dlt.resource(primary_key="id", table_name=lambda i: i["type"])
def repo_events(last_created_at=dlt.sources.incremental("created_at")):
url = "https://api.example.com/events"
response = requests.get(url)
yield response.json()
总结
dlt提供了从简单到复杂的数据加载解决方案,无论是从基础数据结构、文件、API还是数据库,都能以一致的方式处理。其增量加载、合并更新和动态表分配等高级功能,使得构建生产级数据管道变得简单高效。通过本文的示例,开发者可以快速上手dlt并在实际项目中应用这些技术。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考