如何将Snowflake中的FILE_FORMAT写成Java代码?
How to write FILE_FORMAT in Snowflake to Java code?
我正在尝试在 Java 代码中执行 COPY INTO 语句,如下所示:
copy into s3://snowflake
from "TEST"."PUBLIC"."USER_TABLE_TEMP"
storage_integration = s3_int
file_format = CSV_TEST;
而且效果很好。
有没有办法在Java代码中添加这个file_format
,这样就不需要在Snowflake中设置了?
比如我在Snowflake中设置的file_format
的SQL代码是
ALTER FILE FORMAT "TEST"."PUBLIC".CSV_TEST SET COMPRESSION = 'NONE' FIELD_DELIMITER =
',' RECORD_DELIMITER = '\n' SKIP_HEADER = 0 FIELD_OPTIONALLY_ENCLOSED_BY = 'NONE'
TRIM_SPACE = TRUE ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE ESCAPE = 'NONE'
ESCAPE_UNENCLOSED_FIELD = '4' DATE_FORMAT = 'AUTO' TIMESTAMP_FORMAT = 'AUTO' NULL_IF = ('\N');
有什么方法可以将其写成 Java 代码吗?
更新
这是我使用 copy into 语句的代码:
String q = "COPY INTO s3://snowflake/"+ userId +" from \"EPICEROS\".\"PUBLIC\".\"USER_TABLE_TEMP\" storage_integration = s3_int file_format = CSV_TEST OVERWRITE=TRUE;";
jdbcTemplatePerBrand.get(brand).query(q, s -> {});
那么我如何应用在执行查询时创建的 file_format?
您想要一个 EXTERNAL STAGE
你会创建这样的:
CREATE STAGE awesome_stange_name
URL = 's3://snowflake'
FILE_FORMAT = test.public.csv_test
然后你可以复制到里面:
COPY INTO @awesome_stange_name
FROM test.public.user_table_temp;
这意味着如果进行复制的用户有权使用该平台,那么他们无需访问使用该安全位置所需的安全令牌即可。
Is there any way to write this as Java code?
在 Snowflake 中,创建和更改文件格式是通过 SQL 完成的。您可以通过 Java.
中的 JDBC 连接简单地执行 SQL 语句
如果尚未创建文件格式,只需将更改更改为创建:
CREATE FILE FORMAT "TEST"."PUBLIC".CSV_TEST COMPRESSION = 'NONE' FIELD_DELIMITER =
',' RECORD_DELIMITER = '\n' SKIP_HEADER = 0 FIELD_OPTIONALLY_ENCLOSED_BY = 'NONE'
TRIM_SPACE = TRUE ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE ESCAPE = 'NONE'
ESCAPE_UNENCLOSED_FIELD = '4' DATE_FORMAT = 'AUTO' TIMESTAMP_FORMAT = 'AUTO' NULL_IF = ('\N');
将其分配给像 sql
这样的字符串变量,只是 运行 它就像使用 JDBC 的任何其他语句一样:
ResultSet rs = stmt.executeQuery(sql);
然后您可以有一行 rs.next();
并从第一个序数列或列名 status
(小写)读取以获取 success/failure 消息。
这是我为我的问题找到的解决方案。
为了能够从代码中编写 file_format
而不是在 Snowflake 中创建代码,我这样做了:
copy into s3://snowflake
from "TEST"."PUBLIC"."USER_TABLE_TEMP"
storage_integration = s3_int
OVERWRITE = TRUE
file_format = (type = csv compression = 'none' file_extension ='csv'
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ()
single = true
max_file_size = 4900000000;
我还添加了 OVERWRITE = TRUE
这意味着如果我的文件已经存在于 S3 中,请用新文件覆盖它。
single = true
和 max_file_size = 4900000000
表示我允许导出最大 5 GB 的文件。如果我没有添加这两个,我的一个大文件将被分成几个较小的 .csv
文件,这是我不想要的。
我正在尝试在 Java 代码中执行 COPY INTO 语句,如下所示:
copy into s3://snowflake
from "TEST"."PUBLIC"."USER_TABLE_TEMP"
storage_integration = s3_int
file_format = CSV_TEST;
而且效果很好。
有没有办法在Java代码中添加这个file_format
,这样就不需要在Snowflake中设置了?
比如我在Snowflake中设置的file_format
的SQL代码是
ALTER FILE FORMAT "TEST"."PUBLIC".CSV_TEST SET COMPRESSION = 'NONE' FIELD_DELIMITER =
',' RECORD_DELIMITER = '\n' SKIP_HEADER = 0 FIELD_OPTIONALLY_ENCLOSED_BY = 'NONE'
TRIM_SPACE = TRUE ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE ESCAPE = 'NONE'
ESCAPE_UNENCLOSED_FIELD = '4' DATE_FORMAT = 'AUTO' TIMESTAMP_FORMAT = 'AUTO' NULL_IF = ('\N');
有什么方法可以将其写成 Java 代码吗?
更新
这是我使用 copy into 语句的代码:
String q = "COPY INTO s3://snowflake/"+ userId +" from \"EPICEROS\".\"PUBLIC\".\"USER_TABLE_TEMP\" storage_integration = s3_int file_format = CSV_TEST OVERWRITE=TRUE;";
jdbcTemplatePerBrand.get(brand).query(q, s -> {});
那么我如何应用在执行查询时创建的 file_format?
您想要一个 EXTERNAL STAGE
你会创建这样的:
CREATE STAGE awesome_stange_name
URL = 's3://snowflake'
FILE_FORMAT = test.public.csv_test
然后你可以复制到里面:
COPY INTO @awesome_stange_name
FROM test.public.user_table_temp;
这意味着如果进行复制的用户有权使用该平台,那么他们无需访问使用该安全位置所需的安全令牌即可。
Is there any way to write this as Java code?
在 Snowflake 中,创建和更改文件格式是通过 SQL 完成的。您可以通过 Java.
中的 JDBC 连接简单地执行 SQL 语句如果尚未创建文件格式,只需将更改更改为创建:
CREATE FILE FORMAT "TEST"."PUBLIC".CSV_TEST COMPRESSION = 'NONE' FIELD_DELIMITER =
',' RECORD_DELIMITER = '\n' SKIP_HEADER = 0 FIELD_OPTIONALLY_ENCLOSED_BY = 'NONE'
TRIM_SPACE = TRUE ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE ESCAPE = 'NONE'
ESCAPE_UNENCLOSED_FIELD = '4' DATE_FORMAT = 'AUTO' TIMESTAMP_FORMAT = 'AUTO' NULL_IF = ('\N');
将其分配给像 sql
这样的字符串变量,只是 运行 它就像使用 JDBC 的任何其他语句一样:
ResultSet rs = stmt.executeQuery(sql);
然后您可以有一行 rs.next();
并从第一个序数列或列名 status
(小写)读取以获取 success/failure 消息。
这是我为我的问题找到的解决方案。
为了能够从代码中编写 file_format
而不是在 Snowflake 中创建代码,我这样做了:
copy into s3://snowflake
from "TEST"."PUBLIC"."USER_TABLE_TEMP"
storage_integration = s3_int
OVERWRITE = TRUE
file_format = (type = csv compression = 'none' file_extension ='csv'
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ()
single = true
max_file_size = 4900000000;
我还添加了 OVERWRITE = TRUE
这意味着如果我的文件已经存在于 S3 中,请用新文件覆盖它。
single = true
和 max_file_size = 4900000000
表示我允许导出最大 5 GB 的文件。如果我没有添加这两个,我的一个大文件将被分成几个较小的 .csv
文件,这是我不想要的。