DatriseAI-first ETL

What every ETL destination does with your semi-structured fields

CRM and SaaS sources hand you fields that don't fit a fixed schema: custom properties, nested objects, arrays that grow. Where those land differs sharply by destination — and the answer is scattered across 22 vendors' documentation.

This is that answer in one table: the native type each destination uses for semi-structured data, the timestamp type it expects, how Datrise applies changes, and the one behaviour that surprises people. Values are written exactly as the vendor names them, so they match what you'd search.

Type mapping by destination

Relational databases

DestinationSemi-structured fields land asTimestampsLoad pattern
PostgreSQLjsonb columnstimestamptzupsert
MySQLJSON columnsDATETIME/TIMESTAMPupsert
Microsoft SQL ServerNVARCHAR(MAX) JSON columnsdatetime2upsert
Oracle DatabaseJSON or CLOB columnsTIMESTAMP WITH TIME ZONEupsert
Supabasejsonb columnstimestamptzupsert
Neonjsonb columnstimestamptzupsert
PlanetScaleJSON columnsDATETIMEupsert

Cloud warehouses

DestinationSemi-structured fields land asTimestampsLoad pattern
SnowflakeVARIANT columnsTIMESTAMP_TZupsert
Google BigQueryJSON or nested/repeated (STRUCT) columnsTIMESTAMPupsert
Amazon RedshiftSUPER columnsTIMESTAMPTZupsert
Databricks SQL WarehouseVARIANT or STRUCT columnsTIMESTAMPupsert
Azure SynapseNVARCHAR(MAX) JSON columnsdatetime2upsert

OLAP engines

DestinationSemi-structured fields land asTimestampsLoad pattern
ClickHouseJSON or Map columnsDateTime64upsert
DuckDBJSON or STRUCT columnsTIMESTAMP WITH TIME ZONEsnapshot

Data lakes

DestinationSemi-structured fields land asTimestampsLoad pattern
Amazon Athenastruct/map columns in Parquettimestampfile merge
Amazon S3 Data Lakenested struct/map fields in ParquetISO-8601 timestamp columnsfile merge
Azure Data Lake Storagenested struct/map fields in ParquetISO-8601 timestamp columnsfile merge

Document stores

DestinationSemi-structured fields land asTimestampsLoad pattern
MongoDBnative nested documentsBSON Dateupsert
Amazon DynamoDBnested map/list attributesISO-8601 string or epoch number attributesupsert

Spreadsheets and files

DestinationSemi-structured fields land asTimestampsLoad pattern
SpreadsheetsJSON-stringified cells for nested fieldsISO-8601 text or serial date cellssnapshot
Airtablelong-text JSON or linked records for nested datadate/dateTime fieldsupsert
CSV FilesJSON-encoded strings for nested fieldsISO-8601 timestamp columnssnapshot

How changes are applied, and what surprises people

One entry per destination: the incremental mechanic Datrise uses, then the behaviour worth knowing before you pick it.

PostgreSQL

Incremental: a watermark on each entity's updated-at, applied with INSERT … ON CONFLICT DO UPDATE

Worth knowing: PostgreSQL folds unquoted identifiers to lowercase, so Datrise normalizes mixed-case source fields to snake_case

Upsert generator: INSERT … ON CONFLICT DO UPDATE

MySQL

Incremental: a watermark on updated-at, applied with INSERT … ON DUPLICATE KEY UPDATE

Worth knowing: MySQL collation matters for CRM text, so Datrise lands utf8mb4 to preserve emoji and non-Latin characters

Upsert generator: INSERT … ON DUPLICATE KEY UPDATE

Microsoft SQL Server

Incremental: a watermark on updated-at, applied with a MERGE statement

Worth knowing: SQL Server defaults to a case-insensitive collation, so Datrise preserves original casing in a metadata column to avoid silent key collisions

Upsert generator: MERGE … WITH (HOLDLOCK)

Oracle Database

Incremental: a watermark on updated-at, applied with MERGE INTO

Worth knowing: Oracle treats an empty string as NULL, so Datrise distinguishes blank source values from missing ones during load

Upsert generator: MERGE INTO … USING

Supabase

Incremental: a watermark on updated-at, applied with INSERT … ON CONFLICT DO UPDATE

Worth knowing: Datrise lands into a dedicated schema and leaves row-level security to you, so synced tables don't inherit public access by accident

Upsert generator: INSERT … ON CONFLICT DO UPDATE

Neon

Incremental: a watermark on updated-at, applied with INSERT … ON CONFLICT DO UPDATE

Worth knowing: Neon separates compute from storage, so Datrise batches writes to keep autoscaling compute from cold-starting on every small change

Upsert generator: INSERT … ON CONFLICT DO UPDATE

PlanetScale

Incremental: a watermark on updated-at, applied with INSERT … ON DUPLICATE KEY UPDATE

Worth knowing: PlanetScale disallows foreign-key constraints by default, so Datrise models relationships by stable id columns rather than enforced FKs

Upsert generator: INSERT … ON DUPLICATE KEY UPDATE

Snowflake

Incremental: staged loads merged on stable id with MERGE, so credits scale with change volume, not table size

Worth knowing: Snowflake upper-cases unquoted identifiers, so Datrise standardizes on lower-case quoted names to keep column references stable

Upsert generator: MERGE INTO … QUALIFY-deduped USING

Google BigQuery

Incremental: appends to a staging table, then MERGE on stable id into the partitioned target

Worth knowing: BigQuery bills by bytes scanned, so Datrise partitions and clusters every table to keep query costs predictable

Upsert generator: MERGE with partition-pruned target

Amazon Redshift

Incremental: COPY from staged files, then a delete-and-insert merge on stable id

Worth knowing: Redshift performance hinges on dist/sort keys, so Datrise picks them from your entity ids and sync timestamps rather than defaulting to EVEN distribution

Upsert generator: DELETE … USING + INSERT (staging pattern)

Databricks SQL Warehouse

Incremental: a Delta MERGE on stable id, with change history available via time travel

Worth knowing: Datrise writes Unity Catalog–governed Delta tables, so lineage and permissions are managed centrally rather than per-notebook

Upsert generator: Delta Lake MERGE INTO

Azure Synapse

Incremental: COPY into staging, then a MERGE on stable id

Worth knowing: Synapse dedicated pools reward good hash-distribution choices, so Datrise distributes on entity ids to avoid data-movement-heavy joins

Upsert generator: MERGE (dedicated SQL pool)

ClickHouse

Incremental: inserts into a ReplacingMergeTree keyed on stable id, so the latest version wins on merge

Worth knowing: ClickHouse deduplicates asynchronously on merge, so Datrise uses ReplacingMergeTree and FINAL-safe queries rather than assuming immediate upserts

Upsert generator: INSERT into ReplacingMergeTree + FINAL

Amazon Athena

Incremental: writes new Parquet partitions and registers them in the Glue Data Catalog

Worth knowing: Athena bills per byte scanned and small files hurt, so Datrise compacts to right-sized Parquet rather than many tiny objects

Upsert generator: MERGE INTO (Iceberg table, engine v3)

Amazon S3 Data Lake

Incremental: writes new date partitions and compacts small files on a schedule

Worth knowing: A lake has no schema enforcement, so Datrise writes a schema manifest alongside the data to keep downstream engines consistent

Upsert generator: append partition + latest-version view

Azure Data Lake Storage

Incremental: writes new date partitions to the container and compacts on a schedule

Worth knowing: ADLS hierarchical namespace makes folder layout matter, so Datrise keeps a predictable entity/date path your Azure engines mount directly

Upsert generator: append partition + latest-version view

MongoDB

Incremental: upserts by stable id with updateOne(upsert) on the source primary key

Worth knowing: Mongo has no fixed schema, so Datrise keeps field types consistent across documents to avoid mixed-type query surprises

Upsert generator: bulkWrite updateOne { upsert: true }

Amazon DynamoDB

Incremental: PutItem/UpdateItem keyed on a partition key derived from the entity id

Worth knowing: DynamoDB rewards access-pattern-first key design, so Datrise sets partition/sort keys from your entity ids rather than scan-heavy defaults

Upsert generator: PutItem with ConditionExpression

Spreadsheets

Incremental: refreshes the tab's rows each run, preserving header order

Worth knowing: Sheets caps out around the low millions of cells, so Datrise lands a curated column set rather than every raw field

CSV Files

Incremental: writes a fresh, fully-typed CSV per entity each run

Worth knowing: CSV has no types, so Datrise emits a companion schema and quotes/escapes consistently so downstream loaders don't misparse commas and newlines

Why BI tools aren't in this table

Datrise also delivers to 21 BI tools, and every one of them resolves to the same answer: nested fields arrive flattened into columns their modelling layer can chart. That's one fact, not 21 — so listing them here would pad the page without informing anyone. BI tools read from a store that is in the table above; pick the store first.

Early access

Get the pipeline instead of the table

This page tells you what each destination does with your data. Datrise does it for you — modelled entities, incremental sync, typed tables, no scripts to babysit. Join the waitlist and we'll bring you in when your source and destination pair is ready.

Browse the integration catalog

See the rate limits and cursors on the source side