We are having snowflake configured with internal_stage as source and destination bigquery with a staging gc_bucket configured.
We have observed when replication runs and the sourceOptions & targetOptions are set with format as parquet, the sling will unload data to stage, download it to local machine and then will try to upload the data to GCS.
During the download it generates parquet zipped files, but while uploading them to GCS it creates GCS path with csv.
The database_bigquery.go file has importViaGoogleStorage function which ignores the targetOptions. It has hardcoded value for csv.
source: snowflake
target: bigquery
defaults:
object: "{target_schema}.{stream_table_lower}"
mode: full-refresh
source_options:
format: parquet
empty_as_null: false
target_options:
format: parquet
use_bulk: true
streams:
dimensions.daily_users:
mode: full-refresh
sling run -r ./replication_snowflake.yaml -d
2026-03-18 10:35:22 INF Sling CLI | https://slingdata.io
2026-03-18 10:35:22 INF Sling Replication | snowflake -> bigquery | dimension.country
2026-03-18 10:35:22 DBG Sling version: 1.5.12 (darwin arm64)
2026-03-18 10:35:22 DBG type is db-db
2026-03-18 10:35:22 DBG using: {"columns":null,"mode":"full-refresh","select":null,"transforms":null}
2026-03-18 10:35:22 DBG using source options: {"empty_as_null":false,"format":"parquet","datetime_format":"AUTO","max_decimals":-1}
2026-03-18 10:35:22 DBG using target options: {"batch_limit":500000,"datetime_format":"2006-01-02 15:04:05.000000-07","file_max_rows":0,"format":"parquet","max_decimals":-1,"use_bulk":true,"add_new_columns":true,"adjust_column_type":false,"column_casing":"normalize","table_tmp":"`test`.`country_tmp`"}
2026-03-18 10:35:22 INF connecting to source database (snowflake)
2026-03-18 10:35:26 DBG opened "snowflake" connection (conn-snowflake-snowflake-eZe)
2026-03-18 10:35:28 INF connecting to target database (bigquery)
2026-03-18 10:35:29 DBG opened "bigquery" connection (conn-bigquery-bigquery-SSz)
2026-03-18 10:35:30 INF reading from source database
2026-03-18 10:35:32 DBG REMOVE @myapp.PUBLIC.myapp_ETL_INTERNAL_STAGE/sling_temp/1773810332374 [snowflake-eZe]
2026-03-18 10:35:32 DBG COPY INTO '@myapp.PUBLIC.myapp_ETL_INTERNAL_STAGE/sling_temp/1773810332374/01_'
from (select * from "dimension"."country")
FILE_FORMAT = (
TYPE = PARQUET
) [snowflake-eZe]
2026-03-18 10:35:34 DBG applying column casing (normalize) for target type (bigquery)
2026-03-18 10:35:34 DBG Unloaded 260 rows to @myapp.PUBLIC.myapp_ETL_INTERNAL_STAGE/sling_temp/1773810332374
2026-03-18 10:35:34 DBG LIST @myapp.PUBLIC.myapp_ETL_INTERNAL_STAGE/sling_temp/1773810332374 [snowflake-eZe]
2026-03-18 10:35:35 DBG applying column casing (normalize) for target type (bigquery)
2026-03-18 10:35:35 DBG GET @myapp.PUBLIC.myapp_ETL_INTERNAL_STAGE/sling_temp/1773810332374 'file:///var/folders/nm/lg9v9c_n3pd02jz9rrxzn9v40000gp/T/snowflake/get/2026-03-18T103532.374' overwrite=true parallel=12 [snowflake-eZe]
2026-03-18 10:35:39 DBG applying column casing (normalize) for target type (bigquery)
2026-03-18 10:35:39 DBG
+----------------------------------------+------+------------+---------+--------------------------------------+
| FILE | SIZE | STATUS | MESSAGE | _SLING_LOADED_AT |
+----------------------------------------+------+------------+---------+--------------------------------------+
| 1773810332374/01__0_0_0.snappy.parquet | 6402 | DOWNLOADED | | 2026-03-18 10:35:22.685108 +0530 IST |
+----------------------------------------+------+------------+---------+--------------------------------------+
2026-03-18 10:35:39 DBG REMOVE @myapp.PUBLIC.myapp_ETL_INTERNAL_STAGE/sling_temp/1773810332374 [snowflake-eZe]
2026-03-18 10:35:40 DBG opened "file" connection (conn-file-QHz)
2026-03-18 10:35:40 DBG reading datastream from file:///var/folders/nm/lg9v9c_n3pd02jz9rrxzn9v40000gp/T/snowflake/get/2026-03-18T103532.374 [format=parquet, nodes=1]
2026-03-18 10:35:40 DBG select * from read_parquet(['/var/folders/nm/lg9v9c_n3pd02jz9rrxzn9v40000gp/T/snowflake/get/2026-03-18T103532.374/01__0_0_0.snappy.parquet']) [QHz]
2026-03-18 10:35:40 DBG applying column casing (normalize) for target type (bigquery)
2026-03-18 10:35:40 INF writing to target database [mode: full-refresh]
2026-03-18 10:35:41 DBG drop table if exists `test`.`country_tmp` [bigquery-SSz]
2026-03-18 10:35:41 DBG table `test`.`country_tmp` dropped
2026-03-18 10:35:44 DBG create table `test`.`country_tmp` (`_col_0` string,
`_col_1` string,
`_col_2` string,
`_col_3` string,
`_col_4` string,
`_sling_loaded_at` timestamp,
`COUNTRY_CODE` string,
`COUNTRY_NAME` string,
`COUNTRY_REGION` string,
`ST_REGIONS` json,
`ST_SUB_REGIONS` json) [bigquery-SSz]
2026-03-18 10:35:47 INF created table `test`.`country_tmp`
2026-03-18 10:35:47 INF streaming data
2026-03-18 10:35:47 DBG opened "gs" connection (conn-gs-iZd)
2026-03-18 10:35:49 INF importing into bigquery via google storage
2026-03-18 10:35:49 WRN stream has JSON columns - when importing into BigQuery with Parquet, this may cause issues.
2026-03-18 10:35:49 DBG writing to gs://myapp-etl-sling/sling_temp/`test`.`country_tmp`.csv/part.01 [fileRowLimit=0 fileBytesLimit=50000000 compression=gzip concurrency=7 useBufferedStream=false fileFormat=parquet singleFile=false]
2026-03-18 10:35:49 DBG arrow parquet schema:
fields: 6
- _col_0: type=utf8, nullable
- _col_1: type=utf8, nullable
- _col_2: type=utf8, nullable
- _col_3: type=utf8, nullable
- _col_4: type=utf8, nullable
- _sling_loaded_at: type=timestamp[us, tz=UTC], nullable
2026-03-18 10:35:53 DBG Loading gs://myapp-etl-sling/sling_temp/`test`.`country_tmp`.csv/part.01.0001.parquet [5.7 kB]
2026-03-18 10:35:57 DBG select count(*) cnt from `test`.`country_tmp` [bigquery-SSz]
2026-03-18 10:35:58 DBG drop table if exists `test`.`country` [bigquery-SSz]
2026-03-18 10:35:59 DBG table `test`.`country` dropped
2026-03-18 10:36:01 DBG create table `test`.`country` (`_col_0` string,
`_col_1` string,
`_col_2` string,
`_col_3` string,
`_col_4` string,
`_sling_loaded_at` timestamp,
`COUNTRY_CODE` string,
`COUNTRY_NAME` string,
`COUNTRY_REGION` string,
`ST_REGIONS` json,
`ST_SUB_REGIONS` json) [bigquery-SSz]
2026-03-18 10:36:04 INF created table `test`.`country`
2026-03-18 10:36:06 DBG insert into `test`.`country` (`_col_0`, `_col_1`, `_col_2`, `_col_3`, `_col_4`, `_sling_loaded_at`, `COUNTRY_CODE`, `COUNTRY_NAME`, `COUNTRY_REGION`, `ST_REGIONS`, `ST_SUB_REGIONS`) select `_col_0` as `_col_0`, `_col_1` as `_col_1`, `_col_2` as `_col_2`, `_col_3` as `_col_3`, `_col_4` as `_col_4`, `_sling_loaded_at` as `_sling_loaded_at`, `COUNTRY_CODE` as `COUNTRY_CODE`, `COUNTRY_NAME` as `COUNTRY_NAME`, `COUNTRY_REGION` as `COUNTRY_REGION`, `ST_REGIONS` as `ST_REGIONS`, `ST_SUB_REGIONS` as `ST_SUB_REGIONS` from `test`.`country_tmp` [bigquery-SSz]
2026-03-18 10:36:08 DBG inserted rows into `test`.`country` from temp table `test`.`country_tmp`
2026-03-18 10:36:08 INF inserted 260 rows into `test`.`country` in 46 secs [6 r/s] [19 kB]
2026-03-18 10:36:09 DBG closed "snowflake" connection (conn-snowflake-snowflake-eZe)
2026-03-18 10:36:09 DBG closed "bigquery" connection (conn-bigquery-bigquery-SSz)
2026-03-18 10:36:09 INF execution succeeded
Sling version:
1.5.12
What is the Operating System?
Mac
Do you have a CLI Pro/Platform subscription?
No
Description of the issue
We are having snowflake configured with internal_stage as source and destination bigquery with a staging gc_bucket configured.
We have observed when replication runs and the sourceOptions & targetOptions are set with format as parquet, the sling will unload data to stage, download it to local machine and then will try to upload the data to GCS.
During the download it generates parquet zipped files, but while uploading them to GCS it creates GCS path with csv.
The database_bigquery.go file has importViaGoogleStorage function which ignores the targetOptions. It has hardcoded value for csv.
sling-cli/core/dbio/database/database_bigquery.go
Line 749 in 259ada6
2026-03-18 10:35:53 DBG Loading gs://myapp-etl-sling/sling_temp/
test.country_tmp.csv/part.01.0001.parquet [5.7 kB]Replication Configuration
Log Output