class_docstr: A base class for data sources.
  
  This class represents a custom data source that allows for reading from and/or
  writing to it. The data source provides methods to create readers and writers
  for reading and writing data, respectively. At least one of the methods ``reader``
  or ``writer`` must be implemented by any subclass to make the data source either
  readable or writable (or both).
  
  After implementing this interface, you can start to load your data source using
  ``spark.read.format(...).load()`` and save data using ``df.write.format(...).save()``.
  
  .. versionadded: 4.0.0
docstr: Initializes the data source with user-provided options.
  
  Parameters
  ----------
  options : dict
      A case-insensitive dictionary representing the options for this data source.
  
  Notes
  -----
  This method should not be overridden.
code: def __init__(self, options: Dict[str, str]) -> None:
      """
      Initializes the data source with user-provided options.
  
      Parameters
      ----------
      options : dict
          A case-insensitive dictionary representing the options for this data source.
  
      Notes
      -----
      This method should not be overridden.
      """
      self.options = options
  
imports: from abc import ABC, abstractmethod
  from collections import UserDict
  from typing import Any, Dict, Iterator, List, Sequence, Tuple, Type, Union, TYPE_CHECKING
  from pyspark.sql import Row
  from pyspark.sql.types import StructType
  from pyspark.errors import PySparkNotImplementedError
label_desc: Use image node_id 1 to create a new DataSource object from inherited base classes: ABC with example: obj = DataSource(options)