Snowflake - 从云存储加载数据加载数据

Posted

技术标签:

【中文标题】Snowflake - 从云存储加载数据加载数据【英文标题】:Snowflake - Loading data loading data from cloud storage 【发布时间】:2020-11-09 08:41:22 【问题描述】:

我有一些数据存储在 S3 存储桶中,我想将其加载到我的一个 Snowflake 数据库中。请您帮助我更好地理解以下两点:

    从文档 (https://docs.snowflake.com/en/user-guide/data-load-s3.html) 中,我看到最好先创建一个外部阶段,然后再使用 COPY INTO 操作加载数据,但这不是强制性的。 ==> 创建这个外部步骤的优点/用途是什么,如果你不创建它,在后台会发生什么 ==> 在 COPY INTO doc 中,说数据必须预先暂存。如果数据没有暂存,Snowflake 会创建一个临时阶段?

    如果我的 S3 存储桶与我的雪花数据库不在同一个区域,是否仍然可以直接加载数据,或者必须先将数据传输到与雪花数据库相同区域的另一个 S3 存储桶? 由于网络传输时间,我希望它仍然可能但速度较慢?

提前致谢

【问题讨论】:

1.这不是强制性的,但如果您想定期批量加载,建议您这样做。如果是一次性off,请参见此处如何直接加载。 2. 也不是强制性的,但确实会因为网络流量而变慢。 一般情况下,数据必须在 Snowflake 加载之前进行暂存(您也可以通过 WebUI 加载小文件)。 Snowflake 自动为每个用户创建一个“用户阶段”,为每个表创建一个“表阶段”;将数据复制到这些阶段然后允许将其加载到雪花表中(用户阶段到任何表,表阶段仅到关联表)。用户可以创建命名阶段,这些阶段可以是内部的或外部的:内部显然位于您的 Snowflake 帐户中;指向受支持的云位置(S3、Azure、谷歌云存储)的外部点 @NickW 这不是真的。我相信问题是创建舞台对象的好处是什么。您无需定义外部阶段即可从 S3 存储桶加载数据。您可以直接引用 S3 存储桶并在没有阶段对象的情况下加载数据。 @MikeWalton 感谢您的更正 - 知道我什么时候错了总是有用的!您的答案非常全面(与我的相比也很准确)——我能想到的阶段的唯一其他重要优势是您可以直接查询它。我不相信您可以在不创建阶段(或外部表)的情况下查询外部文件? 【参考方案1】:

    创建外部阶段的主要优点是能够将文件格式直接绑定到阶段,而不必担心在每个COPY INTO 语句中定义它。您还可以绑定包含所有安全信息的连接对象,以使其对用户透明。最后,如果您有大量引用阶段的代码,但最终移动了存储桶,则无需更新任何代码。这对于 Dev 到 Prod 的迁移也很好。

    Snowflake 可以从任何 S3 存储桶加载,无论区域如何。 可能会慢一点,但不会比您将它复制到不同的存储桶然后加载到 Snowflake 慢。请注意,跨区域移动数据可能会产生一些来自 AWS 的出口费用。

【讨论】:

感谢各位先生的解答!

以上是关于Snowflake - 从云存储加载数据加载数据的主要内容,如果未能解决你的问题,请参考以下文章

使用云功能从云存储中将数据加载到BigQuery中(替代功能?)

将 csv 文件从云存储批量加载到 bigquery

将 csv 文件从云存储加载到大查询

400 Bad Request 错误尝试从云存储加载 bigquery 表

Snowflake:数据加载文件大小建议

如何克服 Snowflake Varchar (16,777,216) 加载图像数据的限制