通过dbt导入shapefile到Redshift的最佳方式



我有一个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运行执行之前,这个表始终在目标模式中。

相关内容

  • 没有找到相关文章

最新更新