code: def save(self, path=None, format=None, mode=None, partitionBy=None, **options):
          
          self.mode(mode).options(**options)
          if partitionBy is not None:
              self.partitionBy(partitionBy)
          if format is not None:
              self.format(format)
          if path is None:
              self._jwrite.save()
          else:
              self._jwrite.save(path)
docs: Saves the contents of the :class:`DataFrame` to a data source.
  
          The data source is specified by the ``format`` and a set of ``options``.
          If ``format`` is not specified, the default data source configured by
          ``spark.sql.sources.default`` will be used.
  
          :param path: the path in a Hadoop supported file system
          :param format: the format used to save
          :param mode: specifies the behavior of the save operation when data already exists.
  
              * ``append``: Append contents of this :class:`DataFrame` to existing data.
              * ``overwrite``: Overwrite existing data.
              * ``ignore``: Silently ignore this operation if data already exists.
              * ``error`` or ``errorifexists`` (default case): Throw an exception if data already \
                  exists.
          :param partitionBy: names of partitioning columns
          :param options: all other string options
  
          >>> df.write.mode('append').parquet(os.path.join(tempfile.mkdtemp(), 'data'))