class_docstr: InputLoader that reads data in as a Spark DataFrame.
class_docstr_tok: ["InputLoader","that","reads","data","in","as","a","Spark","DataFrame","."]
docstr: Load the contents from a Feature Group's partitioned offline S3 as a DataFrame.
  
  Args:
      s3_data_source (ParquetDataSource):
          A data source that is based in S3.
      input_start_offset (str): Start offset that is used to calculate the input start date.
      input_end_offset (str): End offset that is used to calculate the input end date.
  
  Returns:
      DataFrame: Contents of the data loaded from S3.
docstr_tok: ["Load","the","contents","from","a","Feature","Group","'s","partitioned","offline","S3","as","a","DataFrame",".","Args",":","s3_data_source","(","ParquetDataSource",")",":","A","data","source","that","is","based","in","S3",".","input_start_offset","(","str",")",":","Start","offset","that","is","used","to","calculate","the","input","start","date",".","input_end_offset","(","str",")",":","End","offset","that","is","used","to","calculate","the","input","end","date",".","Returns",":","DataFrame",":","Contents","of","the","data","loaded","from","S3","."]
code: def load_from_date_partitioned_s3(
      self,
      s3_data_source: ParquetDataSource,
      input_start_offset: str,
      input_end_offset: str,
  ) -> DataFrame:
      """Load the contents from a Feature Group's partitioned offline S3 as a DataFrame.
  
      Args:
          s3_data_source (ParquetDataSource):
              A data source that is based in S3.
          input_start_offset (str): Start offset that is used to calculate the input start date.
          input_end_offset (str): End offset that is used to calculate the input end date.
  
      Returns:
          DataFrame: Contents of the data loaded from S3.
      """
  
      spark_session = self.spark_session_factory.spark_session
      s3a_uri = s3_data_source.s3_uri.replace("s3://", "s3a://")
      filter_condition = (
          self._get_s3_partitions_offset_filter_condition(
              input_start_offset, input_end_offset
          )
      )
  
      logger.info(
          "Loading data from %s with filtering condition %s.",
          s3a_uri,
          filter_condition,
      )
      input_df = spark_session.read.parquet(s3a_uri)
      if filter_condition:
          input_df = input_df.filter(filter_condition)
  
      return input_df
  
imports: from __future__ import absolute_import
  import logging
  import re
  from abc import ABC, abstractmethod
  from typing import Generic, Optional, TypeVar, Union
  import attr
  from pyspark.sql import DataFrame
  from sagemaker import Session
  from sagemaker.feature_store.feature_processor._constants import FEATURE_GROUP_ARN_REGEX_PATTERN
  from sagemaker.feature_store.feature_processor._data_source import CSVDataSource, FeatureGroupDataSource, ParquetDataSource, IcebergTableDataSource
  from sagemaker.feature_store.feature_processor._spark_factory import SparkSessionFactory
  from sagemaker.feature_store.feature_processor._input_offset_parser import InputOffsetParser
  from sagemaker.feature_store.feature_processor._env import EnvironmentHelper
label_desc: Use image node_id 2 for calling the SparkDataFrameInputLoader obj's underlying member method code with example usage: obj.load_from_date_partitioned_s3(s3_data_source, input_start_offset, input_end_offset) and returns: input_df