【问题标题】:Snowflake chooses timestamp format over date format on load of CSVSnowflake 在加载 CSV 时选择时间戳格式而不是日期格式
【发布时间】:2020-04-28 21:00:38
【问题描述】:

我有一个 CSV,其中有一列包含基本日期(如 2020 年 1 月 11 日)。

我在FILELOADER中指定了以下格式规范:

  • DATE_FORMAT = 'MM/DD/YYYY'
  • TIMESTAMP_FORMAT = 'MM/DD/YYYY HH24:MI'

这应该使用DATE_FORMAT 为日期列创建匹配项。但是,Snowflake 看到日期列并将其标识为时间戳列。由于该列中不存在时间,因此无法匹配 TIMESTAMP_FORMAT 并且加载失败。

为什么Snowflake 选择将我的日期列标识为时间戳列?

这是我正在使用的完整文件格式规范:

CREATE OR REPLACE FILE FORMAT jobstats_csv_format
  TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1 NULL_IF = ('NULL', 'null') EMPTY_FIELD_AS_NULL = true COMPRESSION = AUTO FIELD_OPTIONALLY_ENCLOSED_BY='"' DATE_FORMAT = 'MM/DD/YYYY' TIMESTAMP_FORMAT = 'MM/DD/YYYY  HH24:MI';

...这个文件格式规范在我的舞台定义中被引用...

CREATE OR REPLACE STAGE tct_jobstats_input_stage
  URL='azure://blahblahblah.blob.core.windows.net/tct-filefly-input/'
  CREDENTIALS=(AZURE_SAS_TOKEN='blahblahblahblahblah')
  FILE_FORMAT = jobstats_csv_format;

...以及我用来加载它的代码...

    try 
    {
        var load_cmd  = "COPY INTO LifelineRemoved ";
            load_cmd += "FROM @tct_jobstats_input_stage ";
            load_cmd += "PATTERN='.*Lifeline Removed During Date Range.*[.]csv.*';";
        var load_stmt = snowflake.createStatement( { sqlText: load_cmd } );
        load_stmt.execute();
    }
    catch (err)
    {
        result =  "Failed: Code: " + err.code + "\n  State: " + err.state;
        result += "\n  Message: " + err.message;
        result += "\nStack Trace:\n" + err.stackTraceTxt; 
    }

... 这是来自 CSV 的(标题 + 单)数据行,无法加载。 帐户,客户状态,认证日期,lifelinermoveddate,lifelinermovedreason,电话号码 1,linestatus,激活日期,断开日期,名字,姓氏,serviceaddress1,serviceaddress2,servicecity,servicestate,servicezip,Column1 123456,Active,11/26/2019,12/1/2019,DSN D Denied 90-5 客户有他们的 LifeL,(321) 5551212,Active,11/26/2019,,JOHN,DOE,1524 示例 ST ,,弗雷斯诺,CA,93706,

...最后是我看到的错误...

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    TIMESTAMP_FORMAT 目前是一项预览功能,因此可能无法用于生产。作为一种解决方法,您可以使用COPY INTO mytable FROM (SELECT FROM ... ) 模式在每个字段上应用自定义转换。或加载为文本并在之后转换。最后,如果您能提供代码和示例数据,总会有帮助。

    【讨论】:

      【解决方案2】:

      我尝试使用您的规范加载示例数据,它在 WebUI 上运行良好。

      这就是我的示例数据的样子

      01/09/2020,01/09/2020 23:59,9th Jan
      01/10/2020,01/10/2020 22:58,10th Jan
      01/11/2020,01/11/2020 21:57,11th Jan
      01/12/2020,01/12/2020 20:56,12th Jan
      

      创建以下文件格式并定义日期/TS 格式

      当您从 WebUI 加载数据时,它可以完美运行。

      使用正确的文件,定义数据类型的格式看起来也很完美。

      如果日期和时间戳的文件格式定义不正确,会出现如下错误

      【讨论】:

      • 我尝试使用您在上面所做的 WebUI 选择创建新的文件格式。不幸的是,对于我的示例数据,我仍然遇到同样的问题。我现在将上传更好的示例数据和我为文件格式配置所做的选择。
      • 为什么不在 SQL 命令中使用选项 (FILEFORMAT => MY_FILE_FORMAT)?我没有看到你的命令的文件格式选项
      • 嗯。我认为这是因为在我的命令中我指的是舞台,并且在舞台定义中,我指定了文件格式。我会更新的。
      • 我似乎无法隔离触发 Snowflake 将该文件中的日期错误识别为时间戳的数据之间的差异(它在所有行上都失败)。我想我是希望你能对代码有所了解。
      • 也许您建议在查询中应用转换,重新格式化日期以使用(也许)破折号可能会触发事情正常工作。这是一种解决方法,现在就足够了。但也许需要为此提交错误报告。
      【解决方案3】:

      检查表定义以确保列类型与预期数据匹配。在我的例子中,我有一个 Timezone_LTZ 列类型,该列应该是 DATE。

      【讨论】:

        猜你喜欢
        • 2013-08-08
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 2012-03-06
        • 2015-12-14
        • 1970-01-01
        • 2016-02-13
        • 2012-01-03
        相关资源
        最近更新 更多