code: def save(
      self,
      path: str,
      path_suffix: str = "",
      output_format: str = "parquet",
  ):
      dfs = [
          self.user_res_feature_vector_mapping.history_access_df,
          self.user_res_feature_vector_mapping.user2component_mappings_df,
          self.user_res_feature_vector_mapping.res2component_mappings_df,
          self.user_res_feature_vector_mapping.user_feature_vector_mapping_df,
          self.user_res_feature_vector_mapping.res_feature_vector_mapping_df,
      ]
  
      adf = next(iter([df for df in dfs if df is not None]))
      assert adf is not None
  
      spark = spark_utils.DataFrameUtils.get_spark_session(adf)
  
      metadata_df = spark.createDataFrame(
          [
              (
                  self.tenant_col,
                  self.user_col,
                  self.user_vec_col,
                  self.res_col,
                  self.res_vec_col,
                  self.output_col,
                  self.user_res_feature_vector_mapping.history_access_df
                  is not None,
                  self.user_res_feature_vector_mapping.user2component_mappings_df
                  is not None,
                  self.user_res_feature_vector_mapping.res2component_mappings_df
                  is not None,
                  self.user_res_feature_vector_mapping.user_feature_vector_mapping_df
                  is not None,
                  self.user_res_feature_vector_mapping.res_feature_vector_mapping_df
                  is not None,
              ),
          ],
          AccessAnomalyModel._metadata_schema(),
      )
  
      metadata_df.write.format(output_format).save(
          os.path.join(path, "metadata_df", path_suffix),
      )
  
      if (
          self.user_res_feature_vector_mapping.history_access_df
          is not None
      ):
          self.user_res_feature_vector_mapping.history_access_df.write.format(
              output_format,
          ).save(
              os.path.join(path, "history_access_df", path_suffix)
          )
  
      if (
          self.user_res_feature_vector_mapping.user2component_mappings_df
          is not None
      ):
          self.user_res_feature_vector_mapping.user2component_mappings_df.write.format(
              output_format,
          ).save(
              os.path.join(
                  path, "user2component_mappings_df", path_suffix
              ),
          )
  
      if (
          self.user_res_feature_vector_mapping.res2component_mappings_df
          is not None
      ):
          self.user_res_feature_vector_mapping.res2component_mappings_df.write.format(
              output_format,
          ).save(
              os.path.join(
                  path, "res2component_mappings_df", path_suffix
              )
          )
  
      if (
          self.user_res_feature_vector_mapping.user_feature_vector_mapping_df
          is not None
      ):
          self.user_res_feature_vector_mapping.user_feature_vector_mapping_df.write.format(
              output_format,
          ).save(
              os.path.join(
                  path, "user_feature_vector_mapping_df", path_suffix
              ),
          )
  
      if (
          self.user_res_feature_vector_mapping.res_feature_vector_mapping_df
          is not None
      ):
          self.user_res_feature_vector_mapping.res_feature_vector_mapping_df.write.format(
              output_format,
          ).save(
              os.path.join(
                  path, "res_feature_vector_mapping_df", path_suffix
              ),
          )
  
imports: import os
  from typing import List, Optional, Tuple
  from synapse.ml.cyber.anomaly.complement_access import ComplementAccessTransformer
  from synapse.ml.cyber.feature import indexers, scalers
  from synapse.ml.cyber.utils import spark_utils
  import numpy
  from pyspark import SQLContext
  from pyspark.ml import Estimator, Transformer
  from pyspark.ml.param.shared import Param, Params
  from pyspark.ml.recommendation import ALS
  from pyspark.sql import DataFrame, functions, types
label_desc: Use image node_id 3 for calling the AccessAnomalyModel obj's underlying member method code with example usage: obj.save(path, path_suffix, output_format) without return types