在做数据准备时,偶而也会遇到有.csv
文件需要读取的情况,dbt
提供seed
功能读取.csv
文件到数据库。读取后的表,可以使用ref()
方法引用。
测试环境
- dbt 1.5
- 数据库:Postgres 14
准备测试数据
可以使用自己准备的测试.csv
文件。也可以使用 jafgen
包来生成测试数据:
- 执行
pip install jafgen
命令安装jafgen
。 - 安装完成后,执行
jafgen --years 1
会在当前目录下的jaffle-data
目录生成一年的测试数据,包括:raw_customers.csv
客户ID和名称raw_items.csv
商品SKU和order_id关联raw_orders.csv
订单时间、门店ID、总额等raw_products.csv
产品价格和描述raw_stores.csv
门店信息raw_supplies.csv
供应信息
- 将
jaffle-data
目录及文件copy
到<dbt-project>/seeds/
目录下。
直接导入数据库
直接执行dbt seed -s raw_items
,会将 raw_items.csv
中的数据导入到在profiles.yml
配置中的默认schema
。9.5w行数据导入,大约需要50秒左右。
dbt
的特性是不允许跨数据库的,但可以用加后缀的方式,来指定不同的schema
。
指定schema
修改 dbt-project.yml
配置,可以将用加后缀的方式,将 .csv
导入到指定的 schema
。
比如我的profiles.yml
中配置了 schema: test
,即默认schema
是 test
。
在 dbt-project.yml
添加以下配置,可以将数据导入到 test_sed
的场景中,其中:
* my_test_dbt
是项目名称
* jaffle-data
是 seeds
目录下的 jaffle-data
目录,即 seed
的路径
* +schema: sed
:在默认场景名后面,增加后缀 sed
# dbt-project.yml
seeds:
my_test_dbt:
jaffle-data:
+schema: sed
指定字段类型
dbt
会提供默认的字段类型,也可以在dbt-project.yml
中还可以配置指定类型。
raw_items
,模型名称+column_types
,指定字段类型,id
、order_id
、sku
是字段名称。
注意:如果raw_items
表已存在,需要先删除表再重新执行dbt run -s raw_items
才能生效,直接执行不会修改字段类型。
# dbt-project.yml
seeds:
my_test_dbt:
jaffle-data:
+schema: sed
raw_items:
+column_types:
id: varchar(36)
order_id: varchar(36)
sku: varchar(36)