我有一个shapefile (DMA区域定义),它是一个静态数据,不会经常改变,所以我想知道通过DBT将它导入Redshift的最佳方法是什么。
我正在寻找类似于dbt种子的东西,但dbt种子只能与csv文件一起工作,而我所拥有的是s3上的geo shapefile。
用于从S3导入它的sql查询如下:
CREATE TABLE dma (
fid INT IDENTITY(1,1),
id BIGINT,
name VARCHAR,
long_name VARCHAR,
geometry GEOMETRY);
COPY dma (geometry, id, name, long_name )
FROM 's3://{somePath}/{someFile}.shp'
FORMAT SHAPEFILE
CREDENTIALS '{someCredentials}';
我希望这个导入Redshift是dbt设置的一部分而不是手动运行一些外部sql查询
您可以将其封装在宏中,以便您可以使用dbt run-operation create_dma_table
之类的东西调用它。为了获得灵感,您可以看到用于管理udf的类似方法。
我将改变create table
的表述,包括replace
,所以它是幂等的。我还会将目标模式添加到表中,这样您就可以在多个环境(dev/prod/等)中构建它。
{% macro create_dma_table() %}
CREATE OR REPLACE TABLE {{target.schema}}.dma (
fid INT IDENTITY(1,1),
id BIGINT,
name VARCHAR,
long_name VARCHAR,
geometry GEOMETRY
);
COPY {{target.schema}}.dma (geometry, id, name, long_name )
FROM 's3://{somePath}/{someFile}.shp'
FORMAT SHAPEFILE
CREDENTIALS '{someCredentials}'
;
{% endmacro %}
您可能还想显式地添加事务处理(例如,BEGIN...COMMIT
),这样它就不会被回滚。
另一种选择是使用run_query
或类似的information_schema
轮询这个表的存在,并在这个宏中添加一个if
块,这样它只在这个表不存在的情况下执行。这将允许您在on-run-start
钩子中运行这个宏,以确保在dbt运行执行之前,这个表始终在目标模式中。