0

每次将镶木地板文件加载到 AWS S3 中的暂存位置时,我的管道都会执行 COPY INTO 命令,这工作得很好(执行)。

这是我的副本查询:(总结)

copy into table_name
from (
        TRY_TO_DATE(
            $1:int_field::varchar,
            'YYYYMMDD'
        ) as date_field
        from @"stage-location"/path/path2/ (FILE_FORMAT = > c000)
    ) ON_ERROR = "SKIP_FILE_1%" PATTERN = ".*part.*"

因此,我将$1:int_field (type:int)转换为 VARCHAR (::varchar),然后将此 varchar 解析为'YYYYMMDD' 格式的 DATE。这对于符合这种格式的int_field来说效果很好,但是当字段为0时,加载失败(仅当被管道执行时)

当管道自行执行 COPY COMMAND 时,我检查了 COPY_HISTORY 并收到以下错误:

Can't parse '0' as date with format 'YYYYMMDD'

当然,加载失败了……加载 失败

这是事情变得有趣的时候:当我自己在工作表中执行这个相同的复制命令时,加载很顺利: OK LOAD

我试过了:

  • VALIDATE, VALIDATION_MODE, VALIDATE_PIPE_LOAD,但是这个函数不支持在加载期间转换数据的 COPY INTO 语句,就像我的一样。
  • FILE_FORMAT= (FORMAT_NAME=c000 DATE_FORMAT='YYYYMMDD') ON_ERROR = "SKIP_FILE_1%">>> SAME ISSUE,只有当我用自己的手执行 COPY COMMAND 时才会加载文件。
  • 我认为问题是“ON_ERROR”选项,但我无法删除它(我认为),我需要过滤真正的错误:(

也许是一些会话问题左右,我阅读了关于 DATE_INPUT_FORMAT 的 smthg,但我无法检测到解决这个问题的确切问题。

有人能帮我吗?谢谢!

4

1 回答 1

0

在我的测试中,我发现它总是失败(即使是独立的 COPY 也不起作用)。另一方面,从暂存文件中查询按预期工作。

select TRY_TO_DATE(
      $1::varchar,
      'YYYYMMDD'
) as date_field
from @my_stage; -- works

copy into testing
from (
select 
   TRY_TO_DATE(
      $1::varchar,
      'YYYYMMDD'
)
  from @my_stage
) ON_ERROR = "SKIP_FILE_1%"; -- fails with "Date '0' is not recognized"

作为 COPY 转换的一部分运行时,TRY_TO_DATE 似乎存在问题。顺便说一句,我测试了 TRY_TO_NUMBER,它可以工作。

您应该向 Snowflake 支持提交案例,以便开发团队可以调查该问题。

于 2020-11-17T12:49:48.433 回答