dbt redshift unload_table 宏数据库问题

dbt redshift unload_table macro database issue

尝试使用 dbt-redshift unload_table 宏。我正进入(状态 22:51:02 模型中的数据库错误 unload_test (models\unload_test.sql) 22:51:02 零长度定界标识符位于或接近“””” 22:51:02 LINE 1: /* {"app": "dbt", "dbt_version": "1.0.0", "profile_name": "d...

unload_test.sql 如下:

{{
  config({
    "materialized":"table",
    "post-hook": [
      "{{ redshift.unload_table(test_ods,
                                user,
                                s3_path='s3:/cj-pilot-test',
                                iam_role='default',
                                header='True',
                                delimiter=',') }}"
    ]
  })
}}
select *
from test_ods.user

任何有关如何调试或解决此问题的帮助或提示都将不胜感激。

运行 dbt=1.0.0 和包

packages:
  - package: dbt-labs/dbt_utils
    version: [">=0.8.0", "<0.9.0"]
    
  - package: dbt-labs/redshift
    version: 0.6.0

我以前没有使用过unload_table宏,但一看,你的论点可能格式不正确。

架构的前两个参数和 table 应作为字符串文字传递。因此,对于您的示例,test_ods 架构应使用单引号传递:'test_ods'.

一个通用示例:

{{ redshift.unload_table('some_schema_name',
                                'some_table_name',
                                s3_path='s3://some-bucket-name',
                                iam_role='arn_for_some_role',
                                header=True,
                                delimiter=',') }}

双花括号内的代码被解释为Python代码,如果不带引号传递test_ods,它将被解释为对python变量的引用,不存在。

或者,如果您想将 当前 模型的架构和 table 作为参数传递,您可以通过传递 this.schema 来引用它们,或者this.table(不带引号)。 this 是一个 in-scope python object,其中包含有关当前正在执行的目标模型的属性。

{{ redshift.unload_table(this.schema,
                                this.table,
                                s3_path='s3://some-bucket-name',
                                iam_role='arn_for_some_role',
                                header=True,
                                delimiter=',') }}

您的其他一些论点可能还需要一些调整。例如,header 参数作为字符串文字传递,技术上应该是布尔值 True。 Redshift 可能会在幕后将其强制转换为布尔值,但这只是需要观察的东西。此外,您的 S3 存储桶地址可能需要有两个正斜杠而不是一个:s3://

这是一个 link 文档,描述了 unload_table 宏期望的数据类型: https://github.com/dbt-labs/redshift/tree/0.2.3/#unload_table-source

调试此类问题的一个好方法是查看正在执行的 SQL。当您查看代码的呈现方式时,通常会更明显地看出代码的哪一部分可能会导致问题。日志通常是查看已执行 SQL 的最佳位置。这是一个关于查找位置的有用页面:https://docs.getdbt.com/faqs/checking-logs

希望这对您有所帮助,祝您解决问题顺利。