Snowflake target
Snowflake target support is under active development and not yet publicly available. The configuration and behavior described below reflect the current design and may change before release.
DBConvert Streams is adding Snowflake as a future target for Load workflows. The planned flow stages Parquet files before loading them into Snowflake.
Prerequisites
- Network reachability to your Snowflake endpoint
- Valid credentials with database/schema access
- A Snowflake user stage (
@~) is used by default for file uploads
Connection settings
| Field | Required | Description |
|---|---|---|
account | Yes | Snowflake account identifier (e.g., xy12345.us-east-1) |
username | Yes | Snowflake username |
password | Yes | Snowflake password |
database | No | Default database |
schema | No | Default schema |
warehouse | No | Default warehouse |
role | No | Default role |
Stream configuration
The Snowflake target uses spec.snowflake with a required staging block that controls how intermediate Parquet files are generated and uploaded.
{
"name": "MySQL to Snowflake",
"mode": "load",
"source": {
"id": "conn_mysql",
"spec": {
"db": {
"database": "commerce"
}
}
},
"target": {
"id": "conn_snowflake",
"spec": {
"snowflake": {
"database": "ANALYTICS",
"schema": "PUBLIC",
"staging": {
"fileFormat": "parquet",
"outputDirectory": "/tmp/snowflake-staging",
"format": {
"compression": "zstd"
}
}
}
}
}
}
Target fields
| Field | Required | Default | Description |
|---|---|---|---|
database | Yes | — | Target Snowflake database |
schema | No | PUBLIC | Target schema |
schemaPolicy | No | fail_if_exists | How to handle existing tables |
writeMode | No | fail_if_not_empty | How to handle existing rows |
Staging fields
| Field | Required | Default | Description |
|---|---|---|---|
staging.fileFormat | No | parquet | Intermediate file format: parquet, csv, jsonl |
staging.outputDirectory | No | System temp dir | Local directory for intermediate files before upload |
staging.format.compression | No | zstd | Compression for intermediate files |
How loading works
- Source data is converted to Parquet format
- Parquet files are organized per table with Hive-style partitioning
- Files are uploaded to a Snowflake stage
COPY INTOloads the data withUSE_LOGICAL_TYPE = TRUEfor correct type handling
Multiple Parquet chunk files per table are consolidated into the target table automatically.
Why Parquet
Parquet is the default and recommended format for Snowflake targets.
| Aspect | Parquet | CSV.gz |
|---|---|---|
| Loading method | Vectorized | Line-by-line parsing |
| Schema | Self-describing | Requires manual mapping |
| Type safety | Validated at write time | Runtime errors |
| Analytical queries | Column pruning | Full scan required |
No additional configuration is needed — the stream generates Parquet files with zstd compression by default.
Type handling
Timestamps
Snowflake's COPY INTO command runs with USE_LOGICAL_TYPE = TRUE, which ensures Parquet logical types are interpreted correctly. Supported types: DATE, TIME, DATETIME, TIMESTAMP, and TIMESTAMP WITH TIME ZONE.
Binary data (BLOBs)
MySQL BLOB and binary columns are automatically base64-encoded and mapped to VARCHAR in Snowflake. This avoids UTF-8 validation errors during Parquet loading. The conversion is transparent — no manual configuration needed.
Verification
After a stream completes, verify the data in Snowflake:
-- Check row counts
SELECT COUNT(*) FROM my_table;
-- Verify timestamp values
SELECT created_at FROM my_table LIMIT 5;
-- Check binary data (stored as base64)
SELECT LENGTH(picture_column) FROM my_table WHERE picture_column IS NOT NULL;
Limitations
- Target only — Snowflake is not supported as a source
- Load mode only — CDC is not supported for Snowflake targets
- Binary size — base64 encoding adds ~33% size overhead for BLOB columns