code: def _save(self, uri: URI, schema, options: dict):
      if options is None:
          options = {}
      partitions = options.get("partitions")
      if uri.scheme == "hdfs":
          table = self._rdd.map(lambda x: HDFSCoder.encode(x[0], x[1]))
          if partitions:
              table = table.repartition(partitions)
          table.saveAsTextFile(uri.original_uri)
          schema.update(self.schema)
          return
  
      if uri.scheme == "hive":
          table = self._rdd.map(lambda x: HiveCoder.encode(x[0], x[1]))
          if partitions:
              table = table.repartition(partitions)
          table.toDF().write.saveAsTable(uri.original_uri)
          schema.update(self.schema)
          return
  
      if uri.scheme == "file":
          table = self._rdd.map(lambda x: HDFSCoder.encode(x[0], x[1]))
          if partitions:
              table = table.repartition(partitions)
          table.saveAsTextFile(uri.path)
          schema.update(self.schema)
          return
  
      raise NotImplementedError(
          f"uri type {uri} not supported with spark backend"
      )
  
imports: import logging
  import struct
  import typing
  from typing import Callable, Iterable, Tuple, Optional, Any
  import pyspark
  from pyspark.rddsampler import RDDSamplerBase
  from fate.arch import URI
  from fate.arch.computing.api import KVTable, ComputingEngine, K, V
  from fate.arch.computing.api._table import _lifted_reduce_to_serdes, get_serdes_by_type
  from ._materialize import materialize, unmaterialize
label_desc: Use image node_id 18 for calling the Table obj's underlying member method code with example usage: obj._save(uri, schema, options) without return types