如何将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 = truemax_file_size = 4900000000 表示我允许导出最大 5 GB 的文件。如果我没有添加这两个,我的一个大文件将被分成几个较小的 .csv 文件,这是我不想要的。