雪花“PARTITION BY”复制选项,包括输出数据集中的分区列

Posted

技术标签:

【中文标题】雪花“PARTITION BY”复制选项,包括输出数据集中的分区列【英文标题】:Snowflake "PARTITION BY" COPY Option including Partition Columns in output Dataset 【发布时间】:2021-01-22 16:17:55 【问题描述】:

我们正在将数据平台从 Redshift 迁移到 Snowflake,在将 COPY/UNLOAD 命令从 Redshift 转换到 Snowflake 时,我们遇到了 Redshift UNLOAD 命令创建分区数据集的问题。

Snowflake 在 COPY into 命令中确实有一个选项来指定分区列,而我们看到输出数据集与 Redshift 相比存在一些差异:

    Snowflake 正在生成大写的标题。认为这不是一个展示购物者,但由于 Python 区分大小写,它无法读取由 Snowflake 生成的 Parquet 数据集。 Snowflake 中是否有一种方法/选项可以在未加载的文件中以小写形式生成标头?

    Snowflake 在输出数据集/卸载文件中包含分区列。 Redshift 就像 Hive 一样工作,默认情况下它会从输出数据集/卸载文件中排除分区列。有没有办法/选项来排除这些分区列,这样我们就不必修改使用这些数据集的后处理脚本?

    Snowflake 不允许带有 PARTITION BY 选项的 OVERWRITE 模式,因此当作业多次运行时,它会创建重复的数据集/卸载文件。我们计划在重新运行作业之前添加一个预先步骤来手动清理分区文件夹,但是有没有办法在雪花级别上处理这个问题?

由于这些问题正在影响我们读取分区数据的一些后处理 Python 脚本,因此只是想了解是否可以在 Snowflake 级别上处理这些问题,而不是更改脚本。非常感谢您对此的任何意见/建议。

提前致谢。

问候, 加甘迪普

【问题讨论】:

当您在 Snowflake 中说分区时,您的意思是集群吗? 不是集群,而是在以分区形式卸载数据期间。 “COPY into ”中有一个 PARTITION BY 选项,它的行为与 Redshift 上的不同。 【参考方案1】:

我对您的 3 个问题的想法/回答如下:

    标题案例:如果您在查询中为列名设置别名,则输出应遵循这些别名,例如SELECT NAME as "Name" FROM Table1 应该输出“Name”而不是“NAME”的列标题 没有办法排除我知道的分区列 - 这在文档中明确说明:Copy Options:“没有选项可以从卸载的数据文件中省略分区表达式中的列。 " 我不知道。您也许可以编写一个外部函数,然后将这个和 COPY INTO 语句包含在存储过程或一系列任务中 - 但我怀疑这比添加您提到的前置步骤更简单/更容易

【讨论】:

以上是关于雪花“PARTITION BY”复制选项,包括输出数据集中的分区列的主要内容,如果未能解决你的问题,请参考以下文章

关于sql当中的group by 和partition by 的区别。

雪花:加载时出现错误限制时无法复制?

over(partition by)开窗函数的使用

在时间戳列中插入 Null 时,雪花复制到失败

从 AWS S3 复制到雪花,同时包含函数

【SQL】partition by