Migrate from ClickHouse
ClickHouse-class analytical performance from a single Go binary. Drop ZooKeeper and cluster ops, ingest 2.5x faster, and land your data on portable Parquet you own.
Every command in the guide was tested against ClickHouse 26.6.1 and Arc 26.06.3.
Why teams move
ClickHouse and Arc are both fast columnar engines, so this is a migration between peers. Teams move for operations, ingestion, and data ownership, not to escape a slow system.
Operations
One binary, not a cluster
Arc is a single Go binary with embedded consensus. No ZooKeeper or ClickHouse Keeper, no MergeTree merge tuning, no multi-process cluster to babysit. A production ClickHouse cluster typically runs 6+ processes; an Arc cluster runs 3.
Ingestion
2.5x throughput, small batches
Arc sustains 19.9M records/sec vs ClickHouse's 7.0M on the same hardware, and accepts batches from ~1,000 rows instead of ClickHouse's 100,000-row minimums. Moving live writes is a real change: Telegraf's Arc output, or your producers re-targeting Arc's HTTP API.
Portability
Open Parquet you own
Arc stores every table as standard Apache Parquet on storage you control, readable by any Parquet tool. MergeTree is readable only by ClickHouse. On ClickBench with the same Parquet format, Arc matches or beats ClickHouse and wins every cold run.
Migration in three steps
Export each table, load it into Arc, translate the ClickHouse-specific SQL. Run both systems in parallel and shadow-read until you trust the new one.
Export each table
Use clickhouse-client. Parquet is cleanest because column types, including timestamps, carry through untouched.
clickhouse-client --output_format_parquet_string_as_string=1 \
--query "SELECT * FROM cpu ORDER BY time FORMAT Parquet" > cpu.parquetImport into Arc
One command per table. Each table becomes a measurement; Arc reads the Parquet schema directly. (CSV via FORMAT CSVWithNames works too.)
curl -X POST "http://localhost:8000/api/v1/import/parquet?measurement=cpu&time_column=time" \
-H "Authorization: Bearer $ARC_TOKEN" -H "X-Arc-Database: mydb" \
-F "file=@cpu.parquet"Translate your queries
ClickHouse idioms map to standard SQL. Set X-Arc-Database and keep bare table names.
-- ClickHouse: toStartOfInterval(time, INTERVAL 1 HOUR), argMax, sumIf
-- Arc:
SELECT time_bucket(INTERVAL '1 hour', time) AS bucket, avg(usage_idle)
FROM cpu GROUP BY 1 ORDER BY 1;ClickHouse SQL → Arc SQL
The common ClickHouse idioms and their standard-SQL equivalents, all tested to return matching results.
| ClickHouse | Arc (standard SQL) |
|---|---|
toStartOfInterval(t, INTERVAL 1 HOUR) | time_bucket(INTERVAL '1 hour', t) |
argMax(value, time) | arg_max(value, time) |
uniqExact(x) | count(DISTINCT x) |
quantile(0.95)(x) | quantile_cont(x, 0.95) |
sumIf(x, cond) | sum(x) FILTER (WHERE cond) |
FINAL / PREWHERE / SAMPLE | drop or rewrite (no equivalent) |
CREATE TABLE ... ENGINE = MergeTree | not needed (schema-on-write) |
Frequently Asked Questions
Is Arc faster than ClickHouse?
It depends on the comparison. On ClickBench with the same storage format (Parquet) and the same hardware, Arc matches or beats ClickHouse and wins every cold run. Arc also ingests about 2.5x faster (19.9M vs 7.0M records/sec). ClickHouse's native MergeTree format is faster on hot analytical queries, so we do not claim a blanket query speedup. Teams migrate for ingestion throughput, cold-start performance, operational simplicity, and portable storage.
How do I move my ClickHouse data into Arc?
Export each table with clickhouse-client to Parquet (FORMAT Parquet) or CSV (FORMAT CSVWithNames), then import into Arc with POST /api/v1/import/parquet or /import/csv. Parquet is cleanest because column types carry through. This round-trip is documented and tested at docs.basekick.net/arc/migration/clickhouse.
Do my applications need to change to write to Arc?
Yes. ClickHouse's native and HTTP protocols are not spoken by Arc, so ongoing writes move to Arc's HTTP API (MessagePack columnar or Line Protocol) or through Telegraf's Arc output. Many ClickHouse deployments write from application code or Kafka rather than Telegraf, so plan for a real change to the write path, not a connection-string swap.
What do I give up leaving ClickHouse for Arc?
Arc has no table engines, no insert-time materialized views, and no ClickHouse-specific keywords like FINAL, PREWHERE, or SAMPLE. Aggregating/SummingMergeTree rollups become scheduled aggregation jobs. In return you drop ZooKeeper and cluster ops, gain portable Parquet you own, and keep standard SQL for the common time-series patterns.
See the tested, step-by-step guide at docs.basekick.net, or compare the two head-to-head in Arc vs ClickHouse. Benchmark methodology on benchmark.clickhouse.com.
Ready to handle billion-record workloads?
Deploy Arc in minutes. Own your data in open files on your storage. Use for analytics, observability, AI, IoT, or data warehousing.