如何使用小写列名以镶木地板格式从 Snowflake 中卸载数据?
Posted
技术标签:
【中文标题】如何使用小写列名以镶木地板格式从 Snowflake 中卸载数据?【英文标题】:How to unload data from Snowflake in parquet format with lowercase column name? 【发布时间】:2020-06-30 18:44:36 【问题描述】:我必须以小写列名的 parquet 格式将 Snowflake 数据卸载到外部 s3 位置。默认情况下它是大写的,有没有办法做到这一点?
更新: 以下是创建视图的命令:
create view test_view as select 'col1','col2' from target_table;
以下是复制命令:
CREATE OR REPLACE FILE FORMAT dev."table_name" TYPE = 'parquet'
NULL_IF = ('NULL', 'null') COMPRESSION=SNAPPY;
COPY INTO @STAGING.DEV_EXTERNAL_STAGE/20200626/data/20200626/
FROM dev.table_name file_format = dev."table_name"
OVERWRITE=TRUE HEADER = TRUE;
【问题讨论】:
【参考方案1】:不确定这是否按您希望的方式工作,但如果您在要导出的表上创建一个视图,强制使用引号使用小写列名,那么您可以从视图导出,而不是从表中导出应该保存在镶木地板文件中。但是,不确定您是否也会在其中获得引号。
您的创建视图语句只是硬编码字符串,而不是创建具有小写名称的列。应该是这样的:
create view test_view as select col1 as "col1", col2 as "col2" from target_table;
我也没有看到使用显式小写名称创建 file_format 的任何好处。我用这个:
CREATE OR REPLACE FILE FORMAT parquet_fmt TYPE = 'parquet'
NULL_IF = ('NULL', 'null') COMPRESSION=SNAPPY;
然后在 COPY INTO 语句中引用了不同的文件格式,它创建了一个没有问题的文件。我不确定该文件中的列名是如何表示的,但请尝试一下。
【讨论】:
不,这不起作用,得到“SQL 编译错误:缺少列规范” 您介意分享您的视图代码和 COPY INTO 语句吗?也许您可以使用这些详细信息编辑您的原始问题? 添加其他详细信息,包括运行的命令及其错误消息,并且可能还有一个示例可以让 Mike 这样的人能够更好地提供帮助。 @Vishrant 我用更多细节更新了我的答案。我在创建文件时没有收到任何错误。【参考方案2】:在我的用例中,只需使用带有引号的列名的选择即可。所以也许如下所示用FROM (SELECT col1 as "col1", col2 AS col2 FROM coldev.table_name)
替换FROM dev.table_name
可能有效?
CREATE OR REPLACE FILE FORMAT dev."table_name" TYPE = 'parquet'
NULL_IF = ('NULL', 'null') COMPRESSION=SNAPPY;
COPY INTO @STAGING.DEV_EXTERNAL_STAGE/20200626/data/20200626/
FROM (
SELECT col1 as "col1", col2 AS col2 FROM coldev.table_name
)
file_format = dev."table_name"
OVERWRITE=TRUE HEADER = TRUE;
【讨论】:
以上是关于如何使用小写列名以镶木地板格式从 Snowflake 中卸载数据?的主要内容,如果未能解决你的问题,请参考以下文章
我可以直接查询以镶木地板格式存储在 s3 中的数据的红移表吗
将数据从 PySpark 加载到 Redshift 时如何执行列编码