Skip to content

Scheduling Examples

This section shows how to schedule exported SQL using Databricks notebooks.

Prerequisites

Before creating the scheduled notebook, you need to export the SQL from your FeatureByte deployment. See SQL Export for detailed instructions.

import featurebyte as fb

deployment = fb.Deployment.get("my_deployment")
deployment_sql = deployment.get_deployment_sql()

sqls = []
for i, feature_table_sql in enumerate(deployment_sql.feature_table_sqls):
    sql = feature_table_sql.sql_code.replace(
        "{{ CURRENT_TIMESTAMP }}", "CURRENT_TIMESTAMP()"
    )
    full_sql = f"""
CREATE OR REPLACE TABLE daily_customer_features_{i}
USING DELTA
AS
{sql}
"""
    sqls.append(full_sql)
    print(full_sql)

Copy the generated SQL code for use in your notebook.

Creating a Databricks Notebook

Here's a simple SQL notebook that runs your exported SQL daily. This will replace the feature table content on each run:

-- Databricks notebook source
%sql

CREATE OR REPLACE TABLE daily_customer_features
USING DELTA
AS
WITH DEPLOYMENT_REQUEST_TABLE AS (
  SELECT
    REQ."SK_ID_CURR",
    CURRENT_TIMESTAMP() AS POINT_IN_TIME
  FROM (
    SELECT DISTINCT
      "SK_ID_CURR" AS "SK_ID_CURR"
    FROM (
      SELECT
        "SK_ID_CURR" AS "SK_ID_CURR",
        "ClientID" AS "ClientID",
        "CONTRACT_TYPE" AS "CONTRACT_TYPE",
        "AMT_INCOME_TOTAL" AS "AMT_INCOME_TOTAL",
        "AMT_CREDIT" AS "AMT_CREDIT",
        "AMT_ANNUITY" AS "AMT_ANNUITY",
        "AMT_GOODS_PRICE" AS "AMT_GOODS_PRICE",
        "TYPE_SUITE" AS "TYPE_SUITE",
        "REGION_POPULATION_RELATIVE" AS "REGION_POPULATION_RELATIVE",
        "application_time" AS "application_time",
        "DAYS_EMPLOYED" AS "DAYS_EMPLOYED",
        "DAYS_REGISTRATION" AS "DAYS_REGISTRATION",
        "DAYS_ID_PUBLISH" AS "DAYS_ID_PUBLISH",
        "OWN_CAR_AGE" AS "OWN_CAR_AGE",
        "FLAG_MOBIL" AS "FLAG_MOBIL",
        "FLAG_EMP_PHONE" AS "FLAG_EMP_PHONE",
        "FLAG_WORK_PHONE" AS "FLAG_WORK_PHONE",
        "FLAG_CONT_MOBILE" AS "FLAG_CONT_MOBILE",
        "FLAG_PHONE" AS "FLAG_PHONE",
        "FLAG_EMAIL" AS "FLAG_EMAIL",
        "REGION_RATING_CLIENT" AS "REGION_RATING_CLIENT",
        "REGION_RATING_CLIENT_W_CITY" AS "REGION_RATING_CLIENT_W_CITY",
        "WEEKDAY_APPR_PROCESS_START" AS "WEEKDAY_APPR_PROCESS_START",
        "HOUR_APPR_PROCESS_START" AS "HOUR_APPR_PROCESS_START",
        "REG_REGION_NOT_LIVE_REGION" AS "REG_REGION_NOT_LIVE_REGION",
        "REG_REGION_NOT_WORK_REGION" AS "REG_REGION_NOT_WORK_REGION",
        "LIVE_REGION_NOT_WORK_REGION" AS "LIVE_REGION_NOT_WORK_REGION",
        "REG_CITY_NOT_LIVE_CITY" AS "REG_CITY_NOT_LIVE_CITY",
        "REG_CITY_NOT_WORK_CITY" AS "REG_CITY_NOT_WORK_CITY",
        "LIVE_CITY_NOT_WORK_CITY" AS "LIVE_CITY_NOT_WORK_CITY",
        "EXT_SOURCE_1" AS "EXT_SOURCE_1",
        "EXT_SOURCE_2" AS "EXT_SOURCE_2",
        "EXT_SOURCE_3" AS "EXT_SOURCE_3",
        "APARTMENTS_AVG" AS "APARTMENTS_AVG",
        "BASEMENTAREA_AVG" AS "BASEMENTAREA_AVG",
        "YEARS_BEGINEXPLUATATION_AVG" AS "YEARS_BEGINEXPLUATATION_AVG",
        "YEARS_BUILD_AVG" AS "YEARS_BUILD_AVG",
        "COMMONAREA_AVG" AS "COMMONAREA_AVG",
        "ELEVATORS_AVG" AS "ELEVATORS_AVG",
        "ENTRANCES_AVG" AS "ENTRANCES_AVG",
        "FLOORSMAX_AVG" AS "FLOORSMAX_AVG",
        "FLOORSMIN_AVG" AS "FLOORSMIN_AVG",
        "LANDAREA_AVG" AS "LANDAREA_AVG",
        "LIVINGAPARTMENTS_AVG" AS "LIVINGAPARTMENTS_AVG",
        "LIVINGAREA_AVG" AS "LIVINGAREA_AVG",
        "NONLIVINGAPARTMENTS_AVG" AS "NONLIVINGAPARTMENTS_AVG",
        "NONLIVINGAREA_AVG" AS "NONLIVINGAREA_AVG",
        "APARTMENTS_MODE" AS "APARTMENTS_MODE",
        "BASEMENTAREA_MODE" AS "BASEMENTAREA_MODE",
        "YEARS_BEGINEXPLUATATION_MODE" AS "YEARS_BEGINEXPLUATATION_MODE",
        "YEARS_BUILD_MODE" AS "YEARS_BUILD_MODE",
        "COMMONAREA_MODE" AS "COMMONAREA_MODE",
        "ELEVATORS_MODE" AS "ELEVATORS_MODE",
        "ENTRANCES_MODE" AS "ENTRANCES_MODE",
        "FLOORSMAX_MODE" AS "FLOORSMAX_MODE",
        "FLOORSMIN_MODE" AS "FLOORSMIN_MODE",
        "LANDAREA_MODE" AS "LANDAREA_MODE",
        "LIVINGAPARTMENTS_MODE" AS "LIVINGAPARTMENTS_MODE",
        "LIVINGAREA_MODE" AS "LIVINGAREA_MODE",
        "NONLIVINGAPARTMENTS_MODE" AS "NONLIVINGAPARTMENTS_MODE",
        "NONLIVINGAREA_MODE" AS "NONLIVINGAREA_MODE",
        "APARTMENTS_MEDI" AS "APARTMENTS_MEDI",
        "BASEMENTAREA_MEDI" AS "BASEMENTAREA_MEDI",
        "YEARS_BEGINEXPLUATATION_MEDI" AS "YEARS_BEGINEXPLUATATION_MEDI",
        "YEARS_BUILD_MEDI" AS "YEARS_BUILD_MEDI",
        "COMMONAREA_MEDI" AS "COMMONAREA_MEDI",
        "ELEVATORS_MEDI" AS "ELEVATORS_MEDI",
        "ENTRANCES_MEDI" AS "ENTRANCES_MEDI",
        "FLOORSMAX_MEDI" AS "FLOORSMAX_MEDI",
        "FLOORSMIN_MEDI" AS "FLOORSMIN_MEDI",
        "LANDAREA_MEDI" AS "LANDAREA_MEDI",
        "LIVINGAPARTMENTS_MEDI" AS "LIVINGAPARTMENTS_MEDI",
        "LIVINGAREA_MEDI" AS "LIVINGAREA_MEDI",
        "NONLIVINGAPARTMENTS_MEDI" AS "NONLIVINGAPARTMENTS_MEDI",
        "NONLIVINGAREA_MEDI" AS "NONLIVINGAREA_MEDI",
        "FONDKAPREMONT_MODE" AS "FONDKAPREMONT_MODE",
        "HOUSETYPE_MODE" AS "HOUSETYPE_MODE",
        "TOTALAREA_MODE" AS "TOTALAREA_MODE",
        "WALLSMATERIAL_MODE" AS "WALLSMATERIAL_MODE",
        "EMERGENCYSTATE_MODE" AS "EMERGENCYSTATE_MODE",
        "OBS_30_CNT_SOCIAL_CIRCLE" AS "OBS_30_CNT_SOCIAL_CIRCLE",
        "DEF_30_CNT_SOCIAL_CIRCLE" AS "DEF_30_CNT_SOCIAL_CIRCLE",
        "OBS_60_CNT_SOCIAL_CIRCLE" AS "OBS_60_CNT_SOCIAL_CIRCLE",
        "DEF_60_CNT_SOCIAL_CIRCLE" AS "DEF_60_CNT_SOCIAL_CIRCLE",
        "DAYS_LAST_PHONE_CHANGE" AS "DAYS_LAST_PHONE_CHANGE",
        "FLAG_DOCUMENT_2" AS "FLAG_DOCUMENT_2",
        "FLAG_DOCUMENT_3" AS "FLAG_DOCUMENT_3",
        "FLAG_DOCUMENT_4" AS "FLAG_DOCUMENT_4",
        "FLAG_DOCUMENT_5" AS "FLAG_DOCUMENT_5",
        "FLAG_DOCUMENT_6" AS "FLAG_DOCUMENT_6",
        "FLAG_DOCUMENT_7" AS "FLAG_DOCUMENT_7",
        "FLAG_DOCUMENT_8" AS "FLAG_DOCUMENT_8",
        "FLAG_DOCUMENT_9" AS "FLAG_DOCUMENT_9",
        "FLAG_DOCUMENT_10" AS "FLAG_DOCUMENT_10",
        "FLAG_DOCUMENT_11" AS "FLAG_DOCUMENT_11",
        "FLAG_DOCUMENT_12" AS "FLAG_DOCUMENT_12",
        "FLAG_DOCUMENT_13" AS "FLAG_DOCUMENT_13",
        "FLAG_DOCUMENT_14" AS "FLAG_DOCUMENT_14",
        "FLAG_DOCUMENT_15" AS "FLAG_DOCUMENT_15",
        "FLAG_DOCUMENT_16" AS "FLAG_DOCUMENT_16",
        "FLAG_DOCUMENT_17" AS "FLAG_DOCUMENT_17",
        "FLAG_DOCUMENT_18" AS "FLAG_DOCUMENT_18",
        "FLAG_DOCUMENT_19" AS "FLAG_DOCUMENT_19",
        "FLAG_DOCUMENT_20" AS "FLAG_DOCUMENT_20",
        "FLAG_DOCUMENT_21" AS "FLAG_DOCUMENT_21",
        "AMT_REQ_CREDIT_BUREAU_HOUR" AS "AMT_REQ_CREDIT_BUREAU_HOUR",
        "AMT_REQ_CREDIT_BUREAU_DAY" AS "AMT_REQ_CREDIT_BUREAU_DAY",
        "AMT_REQ_CREDIT_BUREAU_WEEK" AS "AMT_REQ_CREDIT_BUREAU_WEEK",
        "AMT_REQ_CREDIT_BUREAU_MON" AS "AMT_REQ_CREDIT_BUREAU_MON",
        "AMT_REQ_CREDIT_BUREAU_QRT" AS "AMT_REQ_CREDIT_BUREAU_QRT",
        "AMT_REQ_CREDIT_BUREAU_YEAR" AS "AMT_REQ_CREDIT_BUREAU_YEAR",
        (
          "AMT_GOODS_PRICE" / NULLIF("AMT_CREDIT", 0)
        ) AS "AMT_GOODS_PRICE To AMT_CREDIT"
      FROM "DEMO_DATASETS"."CREDIT_DEFAULT"."NEW_APPLICATION"
    )
    WHERE
      NOT "SK_ID_CURR" IS NULL
  ) AS REQ
), _FB_AGGREGATED AS (
  SELECT
    REQ."SK_ID_CURR",
    REQ."POINT_IN_TIME",
    "T0"."_fb_internal_SK_ID_CURR_lookup_AMT_GOODS_PRICE To AMT_CREDIT_assign_1" AS "_fb_internal_SK_ID_CURR_lookup_AMT_GOODS_PRICE To AMT_CREDIT_assign_1"
  FROM DEPLOYMENT_REQUEST_TABLE AS REQ
  LEFT JOIN (
    SELECT
      "SK_ID_CURR",
      ANY_VALUE("_fb_internal_SK_ID_CURR_lookup_AMT_GOODS_PRICE To AMT_CREDIT_assign_1") AS "_fb_internal_SK_ID_CURR_lookup_AMT_GOODS_PRICE To AMT_CREDIT_assign_1"
    FROM (
      SELECT
        "SK_ID_CURR" AS "SK_ID_CURR",
        "AMT_GOODS_PRICE To AMT_CREDIT" AS "_fb_internal_SK_ID_CURR_lookup_AMT_GOODS_PRICE To AMT_CREDIT_assign_1"
      FROM (
        SELECT
          "SK_ID_CURR" AS "SK_ID_CURR",
          "ClientID" AS "ClientID",
          "CONTRACT_TYPE" AS "CONTRACT_TYPE",
          "AMT_INCOME_TOTAL" AS "AMT_INCOME_TOTAL",
          "AMT_CREDIT" AS "AMT_CREDIT",
          "AMT_ANNUITY" AS "AMT_ANNUITY",
          "AMT_GOODS_PRICE" AS "AMT_GOODS_PRICE",
          "TYPE_SUITE" AS "TYPE_SUITE",
          "REGION_POPULATION_RELATIVE" AS "REGION_POPULATION_RELATIVE",
          "application_time" AS "application_time",
          "DAYS_EMPLOYED" AS "DAYS_EMPLOYED",
          "DAYS_REGISTRATION" AS "DAYS_REGISTRATION",
          "DAYS_ID_PUBLISH" AS "DAYS_ID_PUBLISH",
          "OWN_CAR_AGE" AS "OWN_CAR_AGE",
          "FLAG_MOBIL" AS "FLAG_MOBIL",
          "FLAG_EMP_PHONE" AS "FLAG_EMP_PHONE",
          "FLAG_WORK_PHONE" AS "FLAG_WORK_PHONE",
          "FLAG_CONT_MOBILE" AS "FLAG_CONT_MOBILE",
          "FLAG_PHONE" AS "FLAG_PHONE",
          "FLAG_EMAIL" AS "FLAG_EMAIL",
          "REGION_RATING_CLIENT" AS "REGION_RATING_CLIENT",
          "REGION_RATING_CLIENT_W_CITY" AS "REGION_RATING_CLIENT_W_CITY",
          "WEEKDAY_APPR_PROCESS_START" AS "WEEKDAY_APPR_PROCESS_START",
          "HOUR_APPR_PROCESS_START" AS "HOUR_APPR_PROCESS_START",
          "REG_REGION_NOT_LIVE_REGION" AS "REG_REGION_NOT_LIVE_REGION",
          "REG_REGION_NOT_WORK_REGION" AS "REG_REGION_NOT_WORK_REGION",
          "LIVE_REGION_NOT_WORK_REGION" AS "LIVE_REGION_NOT_WORK_REGION",
          "REG_CITY_NOT_LIVE_CITY" AS "REG_CITY_NOT_LIVE_CITY",
          "REG_CITY_NOT_WORK_CITY" AS "REG_CITY_NOT_WORK_CITY",
          "LIVE_CITY_NOT_WORK_CITY" AS "LIVE_CITY_NOT_WORK_CITY",
          "EXT_SOURCE_1" AS "EXT_SOURCE_1",
          "EXT_SOURCE_2" AS "EXT_SOURCE_2",
          "EXT_SOURCE_3" AS "EXT_SOURCE_3",
          "APARTMENTS_AVG" AS "APARTMENTS_AVG",
          "BASEMENTAREA_AVG" AS "BASEMENTAREA_AVG",
          "YEARS_BEGINEXPLUATATION_AVG" AS "YEARS_BEGINEXPLUATATION_AVG",
          "YEARS_BUILD_AVG" AS "YEARS_BUILD_AVG",
          "COMMONAREA_AVG" AS "COMMONAREA_AVG",
          "ELEVATORS_AVG" AS "ELEVATORS_AVG",
          "ENTRANCES_AVG" AS "ENTRANCES_AVG",
          "FLOORSMAX_AVG" AS "FLOORSMAX_AVG",
          "FLOORSMIN_AVG" AS "FLOORSMIN_AVG",
          "LANDAREA_AVG" AS "LANDAREA_AVG",
          "LIVINGAPARTMENTS_AVG" AS "LIVINGAPARTMENTS_AVG",
          "LIVINGAREA_AVG" AS "LIVINGAREA_AVG",
          "NONLIVINGAPARTMENTS_AVG" AS "NONLIVINGAPARTMENTS_AVG",
          "NONLIVINGAREA_AVG" AS "NONLIVINGAREA_AVG",
          "APARTMENTS_MODE" AS "APARTMENTS_MODE",
          "BASEMENTAREA_MODE" AS "BASEMENTAREA_MODE",
          "YEARS_BEGINEXPLUATATION_MODE" AS "YEARS_BEGINEXPLUATATION_MODE",
          "YEARS_BUILD_MODE" AS "YEARS_BUILD_MODE",
          "COMMONAREA_MODE" AS "COMMONAREA_MODE",
          "ELEVATORS_MODE" AS "ELEVATORS_MODE",
          "ENTRANCES_MODE" AS "ENTRANCES_MODE",
          "FLOORSMAX_MODE" AS "FLOORSMAX_MODE",
          "FLOORSMIN_MODE" AS "FLOORSMIN_MODE",
          "LANDAREA_MODE" AS "LANDAREA_MODE",
          "LIVINGAPARTMENTS_MODE" AS "LIVINGAPARTMENTS_MODE",
          "LIVINGAREA_MODE" AS "LIVINGAREA_MODE",
          "NONLIVINGAPARTMENTS_MODE" AS "NONLIVINGAPARTMENTS_MODE",
          "NONLIVINGAREA_MODE" AS "NONLIVINGAREA_MODE",
          "APARTMENTS_MEDI" AS "APARTMENTS_MEDI",
          "BASEMENTAREA_MEDI" AS "BASEMENTAREA_MEDI",
          "YEARS_BEGINEXPLUATATION_MEDI" AS "YEARS_BEGINEXPLUATATION_MEDI",
          "YEARS_BUILD_MEDI" AS "YEARS_BUILD_MEDI",
          "COMMONAREA_MEDI" AS "COMMONAREA_MEDI",
          "ELEVATORS_MEDI" AS "ELEVATORS_MEDI",
          "ENTRANCES_MEDI" AS "ENTRANCES_MEDI",
          "FLOORSMAX_MEDI" AS "FLOORSMAX_MEDI",
          "FLOORSMIN_MEDI" AS "FLOORSMIN_MEDI",
          "LANDAREA_MEDI" AS "LANDAREA_MEDI",
          "LIVINGAPARTMENTS_MEDI" AS "LIVINGAPARTMENTS_MEDI",
          "LIVINGAREA_MEDI" AS "LIVINGAREA_MEDI",
          "NONLIVINGAPARTMENTS_MEDI" AS "NONLIVINGAPARTMENTS_MEDI",
          "NONLIVINGAREA_MEDI" AS "NONLIVINGAREA_MEDI",
          "FONDKAPREMONT_MODE" AS "FONDKAPREMONT_MODE",
          "HOUSETYPE_MODE" AS "HOUSETYPE_MODE",
          "TOTALAREA_MODE" AS "TOTALAREA_MODE",
          "WALLSMATERIAL_MODE" AS "WALLSMATERIAL_MODE",
          "EMERGENCYSTATE_MODE" AS "EMERGENCYSTATE_MODE",
          "OBS_30_CNT_SOCIAL_CIRCLE" AS "OBS_30_CNT_SOCIAL_CIRCLE",
          "DEF_30_CNT_SOCIAL_CIRCLE" AS "DEF_30_CNT_SOCIAL_CIRCLE",
          "OBS_60_CNT_SOCIAL_CIRCLE" AS "OBS_60_CNT_SOCIAL_CIRCLE",
          "DEF_60_CNT_SOCIAL_CIRCLE" AS "DEF_60_CNT_SOCIAL_CIRCLE",
          "DAYS_LAST_PHONE_CHANGE" AS "DAYS_LAST_PHONE_CHANGE",
          "FLAG_DOCUMENT_2" AS "FLAG_DOCUMENT_2",
          "FLAG_DOCUMENT_3" AS "FLAG_DOCUMENT_3",
          "FLAG_DOCUMENT_4" AS "FLAG_DOCUMENT_4",
          "FLAG_DOCUMENT_5" AS "FLAG_DOCUMENT_5",
          "FLAG_DOCUMENT_6" AS "FLAG_DOCUMENT_6",
          "FLAG_DOCUMENT_7" AS "FLAG_DOCUMENT_7",
          "FLAG_DOCUMENT_8" AS "FLAG_DOCUMENT_8",
          "FLAG_DOCUMENT_9" AS "FLAG_DOCUMENT_9",
          "FLAG_DOCUMENT_10" AS "FLAG_DOCUMENT_10",
          "FLAG_DOCUMENT_11" AS "FLAG_DOCUMENT_11",
          "FLAG_DOCUMENT_12" AS "FLAG_DOCUMENT_12",
          "FLAG_DOCUMENT_13" AS "FLAG_DOCUMENT_13",
          "FLAG_DOCUMENT_14" AS "FLAG_DOCUMENT_14",
          "FLAG_DOCUMENT_15" AS "FLAG_DOCUMENT_15",
          "FLAG_DOCUMENT_16" AS "FLAG_DOCUMENT_16",
          "FLAG_DOCUMENT_17" AS "FLAG_DOCUMENT_17",
          "FLAG_DOCUMENT_18" AS "FLAG_DOCUMENT_18",
          "FLAG_DOCUMENT_19" AS "FLAG_DOCUMENT_19",
          "FLAG_DOCUMENT_20" AS "FLAG_DOCUMENT_20",
          "FLAG_DOCUMENT_21" AS "FLAG_DOCUMENT_21",
          "AMT_REQ_CREDIT_BUREAU_HOUR" AS "AMT_REQ_CREDIT_BUREAU_HOUR",
          "AMT_REQ_CREDIT_BUREAU_DAY" AS "AMT_REQ_CREDIT_BUREAU_DAY",
          "AMT_REQ_CREDIT_BUREAU_WEEK" AS "AMT_REQ_CREDIT_BUREAU_WEEK",
          "AMT_REQ_CREDIT_BUREAU_MON" AS "AMT_REQ_CREDIT_BUREAU_MON",
          "AMT_REQ_CREDIT_BUREAU_QRT" AS "AMT_REQ_CREDIT_BUREAU_QRT",
          "AMT_REQ_CREDIT_BUREAU_YEAR" AS "AMT_REQ_CREDIT_BUREAU_YEAR",
          (
            "AMT_GOODS_PRICE" / NULLIF("AMT_CREDIT", 0)
          ) AS "AMT_GOODS_PRICE To AMT_CREDIT"
        FROM "DEMO_DATASETS"."CREDIT_DEFAULT"."NEW_APPLICATION"
      )
    )
    GROUP BY
      "SK_ID_CURR"
  ) AS T0
    ON REQ."SK_ID_CURR" = T0."SK_ID_CURR"
)
SELECT
  AGG."SK_ID_CURR",
  CAST("_fb_internal_SK_ID_CURR_lookup_AMT_GOODS_PRICE To AMT_CREDIT_assign_1" AS DOUBLE) AS "NEW_APPLICATION_AMT_GOODS_PRICE_To_AMT_CREDIT",
  CURRENT_TIMESTAMP() AS "POINT_IN_TIME"
FROM _FB_AGGREGATED AS AGG

Scheduling the Notebook

To schedule this notebook in Databricks:

  1. Save the notebook to your Databricks workspace
  2. Go to Jobs -> Create Job
  3. Select your notebook as the task
  4. Set schedule (e.g., "Every 1 day")
  5. Configure cluster settings as needed

Databricks Job Scheduling