- Cron Schedule
- Periodic Trigger
- File Arrival Trigger
- Table Update Trigger
- Continuous Jobs
- Manual Runs
Run jobs on a cron-based schedule.
resources:
jobs:
daily_etl:
name: "Daily ETL"
schedule:
quartz_cron_expression: "0 0 8 * * ?" # Daily at 8 AM
timezone_id: "America/New_York"
pause_status: UNPAUSED
tasks:
- task_key: etl
notebook_task:
notebook_path: ../src/etl.pyfrom databricks.sdk import WorkspaceClient
from databricks.sdk.service.jobs import CronSchedule, PauseStatus
w = WorkspaceClient()
job = w.jobs.create(
name="Daily ETL",
schedule=CronSchedule(
quartz_cron_expression="0 0 8 * * ?",
timezone_id="America/New_York",
pause_status=PauseStatus.UNPAUSED
),
tasks=[...]
){
"name": "Daily ETL",
"schedule": {
"quartz_cron_expression": "0 0 8 * * ?",
"timezone_id": "America/New_York",
"pause_status": "UNPAUSED"
},
"tasks": [...]
}Format: seconds minutes hours day-of-month month day-of-week
| Expression | Description |
|---|---|
0 0 8 * * ? |
Daily at 8:00 AM |
0 0 8 * * MON-FRI |
Weekdays at 8:00 AM |
0 0 */2 * * ? |
Every 2 hours |
0 30 9 * * ? |
Daily at 9:30 AM |
0 0 0 1 * ? |
First day of month at midnight |
0 0 6 ? * MON |
Every Monday at 6:00 AM |
0 0 8 15 * ? |
15th of each month at 8:00 AM |
0 0 8 L * ? |
Last day of month at 8:00 AM |
| Timezone ID | Description |
|---|---|
UTC |
Coordinated Universal Time |
America/New_York |
Eastern Time (US) |
America/Chicago |
Central Time (US) |
America/Denver |
Mountain Time (US) |
America/Los_Angeles |
Pacific Time (US) |
Europe/London |
British Time |
Europe/Paris |
Central European Time |
Asia/Tokyo |
Japan Standard Time |
Run jobs at fixed intervals (simpler than cron).
resources:
jobs:
hourly_sync:
name: "Hourly Sync"
trigger:
pause_status: UNPAUSED
periodic:
interval: 1
unit: HOURS
tasks:
- task_key: sync
notebook_task:
notebook_path: ../src/sync.pyfrom databricks.sdk import WorkspaceClient
from databricks.sdk.service.jobs import TriggerSettings, Periodic, PeriodicTriggerConfigurationTimeUnit, PauseStatus
w = WorkspaceClient()
job = w.jobs.create(
name="Hourly Sync",
trigger=TriggerSettings(
pause_status=PauseStatus.UNPAUSED,
periodic=Periodic(
interval=1,
unit=PeriodicTriggerConfigurationTimeUnit.HOURS
)
),
tasks=[...]
)| Unit | Description |
|---|---|
HOURS |
Run every N hours |
DAYS |
Run every N days |
WEEKS |
Run every N weeks |
# Every 30 minutes (not supported - use cron)
# Minimum periodic interval is 1 hour
# Every 4 hours
trigger:
periodic:
interval: 4
unit: HOURS
# Every 2 days
trigger:
periodic:
interval: 2
unit: DAYS
# Weekly
trigger:
periodic:
interval: 1
unit: WEEKSRun jobs when new files arrive in cloud storage.
resources:
jobs:
process_uploads:
name: "Process Uploads"
trigger:
pause_status: UNPAUSED
file_arrival:
url: "s3://my-bucket/uploads/"
min_time_between_triggers_seconds: 60
wait_after_last_change_seconds: 30
tasks:
- task_key: process
notebook_task:
notebook_path: ../src/process_files.pyfrom databricks.sdk import WorkspaceClient
from databricks.sdk.service.jobs import TriggerSettings, FileArrivalTriggerConfiguration, PauseStatus
w = WorkspaceClient()
job = w.jobs.create(
name="Process Uploads",
trigger=TriggerSettings(
pause_status=PauseStatus.UNPAUSED,
file_arrival=FileArrivalTriggerConfiguration(
url="s3://my-bucket/uploads/",
min_time_between_triggers_seconds=60,
wait_after_last_change_seconds=30
)
),
tasks=[...]
)| Parameter | Required | Description |
|---|---|---|
url |
Yes | Cloud storage URL to monitor |
min_time_between_triggers_seconds |
No | Minimum wait between triggers (default: 0) |
wait_after_last_change_seconds |
No | Wait time after last file change (default: 0) |
| Cloud | Format | Example |
|---|---|---|
| AWS S3 | s3://bucket/path/ |
s3://my-bucket/data/uploads/ |
| Azure ADLS | abfss://container@account.dfs.core.windows.net/path/ |
abfss://data@myaccount.dfs.core.windows.net/uploads/ |
| GCS | gs://bucket/path/ |
gs://my-bucket/uploads/ |
| Unity Catalog Volume | /Volumes/catalog/schema/volume/path/ |
/Volumes/main/data/uploads/ |
# The trigger provides file information via task context
import json
# Get trigger info from job context
trigger_info = dbutils.jobs.taskValues.get(
taskKey="__trigger_info__",
key="file_arrival",
debugValue={}
)
# Contains: url, files (list of new files)
print(f"New files: {trigger_info.get('files', [])}")Run jobs when Unity Catalog tables are updated.
resources:
jobs:
process_updates:
name: "Process Table Updates"
trigger:
pause_status: UNPAUSED
table_update:
table_names:
- "catalog.schema.source_table"
- "catalog.schema.other_table"
condition: ANY_UPDATED
min_time_between_triggers_seconds: 300
wait_after_last_change_seconds: 60
tasks:
- task_key: process
notebook_task:
notebook_path: ../src/process_changes.pyfrom databricks.sdk import WorkspaceClient
from databricks.sdk.service.jobs import (
TriggerSettings,
TableUpdateTriggerConfiguration,
Condition,
PauseStatus
)
w = WorkspaceClient()
job = w.jobs.create(
name="Process Table Updates",
trigger=TriggerSettings(
pause_status=PauseStatus.UNPAUSED,
table_update=TableUpdateTriggerConfiguration(
table_names=["catalog.schema.source_table"],
condition=Condition.ANY_UPDATED,
min_time_between_triggers_seconds=300,
wait_after_last_change_seconds=60
)
),
tasks=[...]
)| Parameter | Required | Description |
|---|---|---|
table_names |
Yes | List of Unity Catalog tables to monitor |
condition |
No | ANY_UPDATED (default) - trigger when any table updates |
min_time_between_triggers_seconds |
No | Minimum wait between triggers |
wait_after_last_change_seconds |
No | Wait time after last change |
- Tables must be in Unity Catalog
- Job identity needs
SELECTpermission on monitored tables - Works with Delta tables (managed and external)
Always-running jobs that automatically restart.
resources:
jobs:
streaming_job:
name: "Streaming Processor"
continuous:
pause_status: UNPAUSED
tasks:
- task_key: stream
notebook_task:
notebook_path: ../src/streaming_processor.pyfrom databricks.sdk import WorkspaceClient
from databricks.sdk.service.jobs import Continuous, PauseStatus
w = WorkspaceClient()
job = w.jobs.create(
name="Streaming Processor",
continuous=Continuous(
pause_status=PauseStatus.UNPAUSED
),
tasks=[...]
)- Job runs immediately when created/unpaused
- Automatically restarts after completion or failure
- Maintains one active run at a time
- Use
pause_status: PAUSEDto stop
# Pause continuous job
w.jobs.update(
job_id=12345,
new_settings=JobSettings(
continuous=Continuous(pause_status=PauseStatus.PAUSED)
)
)
# Resume continuous job
w.jobs.update(
job_id=12345,
new_settings=JobSettings(
continuous=Continuous(pause_status=PauseStatus.UNPAUSED)
)
)Run jobs on-demand without automatic triggers.
Simply omit schedule, trigger, and continuous:
resources:
jobs:
manual_job:
name: "Manual Job"
# No schedule/trigger = manual only
tasks:
- task_key: run
notebook_task:
notebook_path: ../src/manual_task.pyPython SDK:
# Run with default parameters
run = w.jobs.run_now(job_id=12345)
# Run with custom parameters
run = w.jobs.run_now(
job_id=12345,
job_parameters={"env": "prod", "date": "2024-01-15"}
)
# Wait for completion
run_result = w.jobs.run_now_and_wait(job_id=12345)CLI:
# Run job
databricks jobs run-now 12345
# Run with parameters
databricks jobs run-now 12345 --job-params '{"env": "prod"}'DABs:
databricks bundle run my_job_resource_keyA job can have multiple trigger types (evaluated independently):
resources:
jobs:
multi_trigger:
name: "Multi-Trigger Job"
# Cron schedule
schedule:
quartz_cron_expression: "0 0 6 * * ?"
timezone_id: "UTC"
pause_status: UNPAUSED
# Also trigger on file arrival
trigger:
pause_status: UNPAUSED
file_arrival:
url: "s3://my-bucket/urgent/"
tasks:
- task_key: process
notebook_task:
notebook_path: ../src/process.pyWhen multiple triggers fire simultaneously:
- Job queues runs if
max_concurrent_runs > 1 - Otherwise, subsequent triggers are skipped while a run is active
max_concurrent_runs: 1 # Only one run at a time (default)schedule:
quartz_cron_expression: "0 0 8 * * ?"
timezone_id: "UTC"
pause_status: PAUSED # Job won't run on schedulefrom databricks.sdk.service.jobs import JobSettings, CronSchedule, PauseStatus
w.jobs.update(
job_id=12345,
new_settings=JobSettings(
schedule=CronSchedule(
quartz_cron_expression="0 0 8 * * ?",
timezone_id="UTC",
pause_status=PauseStatus.PAUSED
)
)
)databricks jobs update 12345 --json '{
"new_settings": {
"schedule": {
"pause_status": "PAUSED"
}
}
}'