我们正在与一位客户讨论使用SnowSQL将文件放入Snowflake或使用JDBC驱动程序编写自定义代码是否更快。
有一种观点认为JDBC会比SnowSQL快,因为Java比Python快,Python是SnowSQL的编写语言。但并不是所有人都同意。
我们如何判断哪个更快?
我们可以编写一些最小的代码来比较Python和Java之间的PUT。
让我们从Java代码开始:
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import net.snowflake.client.jdbc.SnowflakeConnection;
public class App {
static String user = "";
static String password = "";
private static final String TMP_TEST_CSV = "/Users/fhoffa/Downloads/pageviews-20210601-000000.gz";
public static void main(String[] args) throws Exception {
Connection conn = DriverManager.getConnection(
"jdbc:snowflake://your-account.snowflakecomputing.com/?db=temp&role=sysadmin&schema=public", user, password);
File file = new File(TMP_TEST_CSV);
FileInputStream fileInputStream = new FileInputStream(file);
conn.unwrap(SnowflakeConnection.class).uploadStream("my_int_stage", "testUploadStream", fileInputStream, "destFile.csv", true);
}
}
用Java放入这个文件花了47秒。我还将压缩选项更改为false,以测试是否会有很大变化,整个过程耗时46秒。
与SnowSQL同时,我做了这个:
#(no warehouse)@TEMP.PUBLIC> put 'file:///Users/fhoffa/Downloads/pageviews-20210601-000000.gz' @~/my_int_stage;
pageviews-20210601-000000.gz(38.59MB): [##########] 100.00% Done (41.330s, 0.93MB/s).
+------------------------------+------------------------------+-------------+-------------+--------------------+--------------------+----------+---------+
| source | target | source_size | target_size | source_compression | target_compression | status | message |
|------------------------------+------------------------------+-------------+-------------+--------------------+--------------------+----------+---------|
| pageviews-20210601-000000.gz | pageviews-20210601-000000.gz | 40460014 | 40460014 | GZIP | GZIP | UPLOADED | |
+------------------------------+------------------------------+-------------+-------------+--------------------+--------------------+----------+---------+
1 Row(s) produced. Time Elapsed: 43.344s
它花费了43秒,比JDBC花费的时间少了10%。因此,没有理由认为Java会比Python快得多。
您的结果可能会有所不同!当通过慢速网络发送文件时,大部分时间将用于处理网络,并且在Java中运行压缩可能会更快。
我在这个例子中使用的文件是一个压缩的CSV:
- https://dumps.wikimedia.org/other/pageviews/2021/2021-06/pageviews-20210601-000000.gz
Snowflake中创建舞台的基本设置:
use role sysadmin;
use schema temp.public;
create stage my_int_stage;