class_docstr: Base class representing a step in an MLflow Recipe
docstr: Executes the step by running common setup operations and invoking
  step-specific code (as defined in ``_run()``).
  
  :param output_directory: String file path to the directory where step
                           outputs should be stored.
  :return: None
docstr_tok: ["Executes","the","step","by","running","common","setup","operations","and","invoking","step-specific","code","(","as","defined","in","``","_run","(",")","``",")",".",":","param","output_directory",":","String","file","path","to","the","directory","where","step","outputs","should","be","stored",".",":","return",":","None"]
code: def run(self, output_directory: str):
      """
      Executes the step by running common setup operations and invoking
      step-specific code (as defined in ``_run()``).
  
      :param output_directory: String file path to the directory where step
                               outputs should be stored.
      :return: None
      """
      _logger.info(f"Running step {self.name}...")
      start_timestamp = time.time()
      self._initialize_databricks_spark_connection_and_hooks_if_applicable()
      try:
          self._update_status(
              status=StepStatus.RUNNING,
              output_directory=output_directory,
          )
          self._validate_and_apply_step_config()
          self.step_card = self._run(output_directory=output_directory)
          self._update_status(
              status=StepStatus.SUCCEEDED,
              output_directory=output_directory,
          )
      except Exception:
          stack_trace = traceback.format_exc()
          self._update_status(
              status=StepStatus.FAILED,
              output_directory=output_directory,
              stack_trace=stack_trace,
          )
          self.step_card = FailureCard(
              recipe_name=self.recipe_name,
              step_name=self.name,
              failure_traceback=stack_trace,
              output_directory=output_directory,
          )
          raise
      finally:
          self._serialize_card(start_timestamp, output_directory)
  
imports: import abc
  import json
  import logging
  import os
  import time
  import traceback
  from enum import Enum
  from typing import Any, Dict, List, Optional
  import yaml
  from mlflow.recipes.cards import CARD_HTML_NAME, CARD_PICKLE_NAME, BaseCard, FailureCard
  from mlflow.recipes.utils import get_recipe_name
  from mlflow.recipes.utils.step import display_html
  from mlflow.tracking import MlflowClient
  from mlflow.utils.databricks_utils import is_in_databricks_runtime
label_desc: Use image node_id 3 for calling the BaseStep obj's underlying member method code with example usage: obj.run(output_directory) without return types