Orchestration

Ray Data vs Daft vs Spark

Ray Data, Daft, and Apache Spark are engines that load, transform, and write large datasets as a job. They are dataframes or dataset APIs, not application catalogs. Pick among them for batch inference, preprocessing, and lake scans. A live table that recomputes one inserted row is a different job.

Updated · Part of What is a declarative pipeline?

Three batch engines

Each product runs a job: read sources, map or SQL-transform, write a sink. None of them is an insert-triggered application schema.

Ray Data

Ray Data is a scalable data processing library for AI workloads on Ray. Official docs emphasize streaming execution between CPU preprocessing and GPU inference or training, map_batches, ActorPoolStrategy, and first-class integration with vLLM, PyTorch, Hugging Face, and TensorFlow. It reads Parquet, Lance, images, JSON, CSV, audio, video, and more. Install: pip install -U 'ray[data]'. Docs: https://docs.ray.io/en/latest/data/data.html

Daft

Daft, from Eventual, is a data engine for AI and multimodal workloads: tables, images, text, audio, video, and embeddings in one Python API, with a Rust engine and no JVM. Official docs describe reading object storage and lakes (Iceberg, Delta Lake), running GPU models, Python UDFs, and LLM APIs, then writing to search indexes, databases, warehouses, or training stores. Scale from a laptop to a cluster without changing the API. Docs: https://docs.daft.ai/en/stable/

Apache Spark

Apache Spark is a unified analytics engine for large-scale data processing. The current docs (Spark 4.2 line) list Spark SQL, DataFrames, pandas API on Spark, MLlib, GraphX, and Structured Streaming, plus Spark Connect for remote clients. APIs in Java, Scala, Python, and R. It runs on standalone clusters, YARN, and Kubernetes. Docs: https://spark.apache.org/docs/latest/

How to choose

Match the engine to the cluster you already run and the data types in the scan.

  • Pick Spark when SQL, warehouses, and an existing Spark/YARN/Kubernetes lakehouse are the company standard.
  • Pick Ray Data when the job is GPU batch inference or training ingest on a Ray cluster.
  • Pick Daft when the dataframe should treat images, video, and embeddings as native types without a JVM.

Last reviewed

Facts on this page were checked against vendor documentation on 2026-10-28. Product surfaces move; treat version names and APIs as directional and follow the official links in Related.

Ray Data vs Daft vs Spark (last reviewed: Oct 2026)

Ray Data vs Daft vs Spark (last reviewed: Oct 2026)
Ray DataDaftApache Spark
What it isStreaming dataset library for AI on RayMultimodal dataframe (Python, Rust engine)Unified analytics engine (SQL, DataFrames, streaming)
ExecutionStreaming blocks, map_batches, actors, GPUsLoad, transform, write; laptop to clusterDAG jobs, Spark SQL, Structured Streaming
Media typesImages, audio, video among other ML formatsNative image, audio, video, embedding typesRows and files; media is bytes or paths unless you add UDFs
RuntimeRay clusterNo JVM; Rust engineJVM; Spark Connect for remote clients
Durable catalogA job; persistence is the sink you chooseA job; persistence is the sink you chooseTables in a warehouse or lake you configure
Official docshttps://docs.ray.io/en/latest/data/data.htmlhttps://docs.daft.ai/en/stable/https://spark.apache.org/docs/latest/

Where Pixeltable fits

Use Pixeltable when the job is a live application schema: insert a row, computed columns and indexes update, HTTP can sit in the same file. It is not a Spark-shaped or Ray-shaped scan over petabytes. Many teams run both: Daft or Ray Data or Spark for a backfill over a lake, Pixeltable for the app that serves new rows.

import pixeltable as pxt
from pixeltable.functions.openai import chat_completions
TableModel = pxt.model_base()
class Docs(TableModel, name='docs'):
text: pxt.String
summary = chat_completions(
messages=[{'role': 'user', 'content': text}],
model='gpt-4o-mini',
).choices[0].message.content
# pxt schema update app.py docs -f
# Insert recomputes that row. Unchanged rows keep the cached summary.

Questions

Is Daft a Spark replacement?

Daft is a dataframe for multimodal AI workloads with a Python API and a Rust engine. Spark is a unified analytics engine with SQL, streaming, and a huge lakehouse ecosystem. Replace Spark with Daft only when the job matches Daft's multimodal batch shape and you do not need Spark SQL as the company standard.

When is Ray Data the right engine?

When you already run Ray and the bottleneck is streaming CPU preprocess into GPU batch inference or training ingest. Official overview: https://docs.ray.io/en/latest/data/data.html

Do any of these replace a vector database?

No. They can write embeddings to a sink (a vector DB, a lake, a warehouse). The index is still a separate product unless you add one.

Where does an application schema fit?

Beside them. Batch engines scan and write. An application schema stores rows and recomputes dependents of a change. Pixeltable is that second job; see Pixeltable vs Daft.

Next step

Install the Pixeltable skill, or sign up for Cloud and run the same file on a hosted database.