是否可以在 csv 中包含列名以及 Snowflake 中的 copy into 语句?

Posted

技术标签:

【中文标题】是否可以在 csv 中包含列名以及 Snowflake 中的 copy into 语句?【英文标题】:Is it possible to include column names in the csv with a copy into statement in Snowflake? 【发布时间】:2016-06-24 08:42:49 【问题描述】:

例如:

COPY INTO @my_stage/my_test.csv 
FROM (select * from my_table) 
FILE_FORMAT = (TYPE = CSV) 
OVERWRITE=TRUE SINGLE=TRUE 

将生成 csv 但不包括列标题。如果无法使用 copy into 语句,是否有任何不明显的技术可以做到这一点?

提前致谢。

【问题讨论】:

【参考方案1】:

我们之前已经看到过这个请求,它在我们的路线图中。如果它对您来说是高优先级,请联系 Snowflake 支持。

如果您正在寻找一种解决方法,很难想出一个真正通用的解决方法。

一种选择是添加具有明确列名的单行,但 您需要提前了解它们,如果 并非所有字段都是字符串。 另一个是转换所有记录 使用 OBJECT_CONSTRUCT(*) 并导出为 JSON,那么您将拥有 列名,但它当然只有在你可以摄取时才有用 JSON。

但我希望 Snowflake 能在不久的将来添加此功能。

【讨论】:

Marcin,感谢您的回复。我正在从 python 应用程序执行此操作。我能够在 查询中执行显示列,使用列列表构建副本以进行正确排序,下载 csv 并在将 csv 加载到 pandas 数据框时设置列名。有点跳圈。我想这个问题现在已经解决了,但我可能会研究 object_construct(我们的字段都不是字符串)。希望他们能够获得该功能。在 csv 中没有标头确实限制了哪些类型的应用程序可以轻松处理数据。
【参考方案2】:

Snowflake 已添加此功能。您可以简单地添加一个选项HEADER=TRUE

COPY INTO @my_stage/my_test.csv 
FROM (select * from my_table) 
FILE_FORMAT = (TYPE = CSV) 
OVERWRITE=TRUE SINGLE=TRUE HEADER=TRUE

【讨论】:

已验证。但是,如果 SINGLE=FALSE 它将把标题放在每个文件中。尝试将文件连接成一个时,这是一个问题。 :( 是的。如果 Snowflake 添加一个用于将标题添加到单个文件的选项会更好。如果此选项对您来说是高优先级,请联系 Snowflake 支持。【参考方案3】:

为了补充@Jiaxing 的回答,Snowflake HEADER 功能还允许您通过AS 命名列来明确定义列名:

COPY INTO @my_stage/my_test.csv 
FROM (
  SELECT
    column1 AS "Column 1",
    column2 AS "Column 2"
  FROM my_table
) FILE_FORMAT = (TYPE = CSV)

【讨论】:

以上是关于是否可以在 csv 中包含列名以及 Snowflake 中的 copy into 语句?的主要内容,如果未能解决你的问题,请参考以下文章

csv文件

自动检测文件中CSV标题的存在

在 SQL Unpivot 中包含列名

带有查询的链接表在列名中包含“/”

awk 可以处理在引用字段中包含逗号的 CSV 文件吗?

PySpark Sql 列名中包含破折号/连字符