Prerequisites
- Delta Lake ingestion can only be enabled for offline Pinot tables
- This connector supports Delta tables hosted on Amazon S3 and Google Cloud Storage(GCS).
- This connector supports only sync mode, meaning each file in Delta Lake maps to a single segment in Pinot. Therefore, it is recommended to size the files appropriately to avoid creating an excessive number of segments. Find the official documentation on how to tune the size of files in your Delta table.
Limitations
- Support for ADLS is not yet available.
- Delta tasks do not utilize checkpoints. Consequently, no table entry is created at the ZK path PROPERTYSTORE→MINION_TASK_METADATA. This limitation applies to both Delta Standalone mode and Delta Kernel mode. Tasks will fail if not completed within one day, as Delta does not track progress. Subsequent triggers will generate new tasks to resume processing.
Pinot Table Configuration
The offline table task configs can be manually set with the following connection and ingestion parameters.Connection Parameters
All the following properties are required to establish connection with Delta Tables.Authentication Parameters
Delta Tables hosted on S3 via Basic Authentication
Use the following JSON configuration when Delta is set up on S3 with Basic AuthenticationProperty Descriptions
Delta Tables hosted on S3 via IAM based Authentication
Property Descriptions
If you are using IAM to managed access to your S3 bucket then, use the following parameters:Delta Tables hosted on GCS
Use the following JSON configuration when Delta is set up on GCSProperty Descriptions
Frequently Asked Questions
What happens if the same row is updated multiple times in my Delta table (e.g., order status updates)?
What happens if the same row is updated multiple times in my Delta table (e.g., order status updates)?
StarTree uses Delta Kernel Library to get the updated list of files and uses the Minion framework to manage data segments. Every time a row is added, updated, or deleted in Delta, the underlying files change, which updates the table version. Pinot detects these changes and updates its corresponding table segments accordingly — ensuring the latest state is always reflected.If there are 1M rows in a table and only one row is updated. This will result into update in one segment only since file and segment has 1:1 mapping. In other words,
- If all 1M rows are stored in a single file and hence one single segment, the entire segment will be replaced even if just one row changes.
- If the 1M rows are split across 10 files, only the relevant segment (1 out of 10) mapped to the particular file containing the updated row will be replaced.
Can I configure Pinot to refresh every minute like my Delta table?
Can I configure Pinot to refresh every minute like my Delta table?
Yes, you can. Pinot supports high-frequency scheduling, including a 1-minute refresh. This will create one ingestion task per minute. However, if you’re targeting sub-minute or near real-time updates, a streaming ingestion approach may be more efficient.
Does StarTree support Unity Catalog (UC) for column-level access control?
Does StarTree support Unity Catalog (UC) for column-level access control?
Not at the moment. Unity Catalog support is currently not available in the Delta Kernel libraries, so Pinot doesn’t support it either. As a workaround, you can filter out restricted columns while creating the Pinot table.
Does Pinot always poll the S3 bucket to list files for ingestion?
Does Pinot always poll the S3 bucket to list files for ingestion?
No. Pinot uses an internal watermark system via Zookeeper to avoid scanning all files every time. It only checks for new files added after the watermark. DeltaIngestionTask (Delta ingestion) relies on Delta’s transaction logs. Starting from version 1.3.0, it no longer uses a watermark — it simply applies the differences between versions.
Does StarTree support Delta Column Mapping?
Does StarTree support Delta Column Mapping?
Yes, We now support column mapping with both NAME and ID mode.
Why does Pinot have more rows than my Databricks table?
Why does Pinot have more rows than my Databricks table?
If the source is a Databricks streaming table built by a CDC pipeline (for example a Lakeflow Connect Salesforce table), its Parquet files keep superseded row versions that Databricks hides at query time. Pinot reads the physical files and ingests those rows too. See Fix Row Count Mismatches for Databricks CDC Delta Tables for the ingestion filter that removes them.
Why does the segment count stay higher than the number of files in my Delta table?
Why does the segment count stay higher than the number of files in my Delta table?
Each ingestion run that replaces segments records a lineage entry, and the replaced segments stay in the table until the hourly retention job deletes them. How long they’re kept is set by
segmentsConfig.replacedSegmentsRetentionPeriod. When it’s unset, StarTree Cloud 0.16 and later default it to 1 hour; earlier releases keep replaced segments for 24 hours on REFRESH tables. With a frequent schedule, such as every 15 minutes, a day of replaced segments can pile up. Set replacedSegmentsRetentionPeriod explicitly (for example "1h") to clean them up sooner. Queries aren’t affected, because only the latest segments are served. SELECT COUNT(*) reflects the live data.
