使用Snowflake JDBC驱动程序自定义Sink到Snowflake非常慢

问题描述

我正在使用Spring Cloud Data Flow创建一个自定义流,以将数据加载到SNowflake。我已经编写了一个自定义接收器,以使用SNowflake的JDBC驱动程序将数据加载到SNowflake中。我使用的方法类似于使用以下步骤进行的任何数据库更新:

  1. 创建一个连接池(用于HikariCP)以获得SNowflake数据库连接。
  2. 使用准备好的语句,创建了一批行以一次全部提交。
  3. 使用计划的计时器将批次提交到雪花。
    这是当我注意到该批处理在SNowflake中的更新非常缓慢时-即一次记录一个或两个记录,并且一批8K行花了45分钟以上的时间在SNowflake表中更新(使用XS仓库)。

我的问题:是否有更好/另一种/推荐的方法将数据流式传输到SNowflake?我知道Kafka连接器连接到SNowflake和SNowpipes(使用内部/外部舞台),但是这些不是我们想要追求的选择。

PreparedStatement preparedStatement = null;
Connection conn = null;
String compiledQuery = "INSERT INTO " + env.getProperty("sNowtable") + " SELECT parse_json (column1) FROM VALUES (?)";
conn = DataSource.getConnection();
preparedStatement = conn.prepareStatement(compiledQuery);
for(int i = 0; i<messageslocal.size(); i++) {
    preparedStatement.setString(1,messageslocal.get(i));
    preparedStatement.addBatch();
}
preparedStatement.executeBatch();

谢谢!

解决方法

一般来说,Snowflake - 像许多列存储或混合存储数据库一样 - 在单行或少量行插入时表现不佳。所以你遇到的糟糕表现对我来说并不奇怪,尤其是在 XS WH 上。

在不知道任务上下文的情况下,我建议写入 JSON、PARQUET 或 CSV 文件(如果您在 AWS 中,则存储在 S3 上),而不是通过 JDBC 直接写入 Snowflake。您可以通过 Snowflake 中的 Stage 使该 JSON/PARQUET/CSV 文件可用。

然后您可以编写一个将舞台数据复制到表的过程,或者将一个物化视图放在舞台的顶部。物化视图或多或少与触发将 JSON/PARQUET/CSV 数据提取到雪花表中的作用相同,但这将异步运行,而不会影响您的应用程序性能。