code: def alias(self, *alias, **kwargs):
          
  
          metadata = kwargs.pop('metadata', None)
          assert not kwargs, 'Unexpected kwargs where passed: %s' % kwargs
  
          sc = SparkContext._active_spark_context
          if len(alias) == 1:
              if metadata:
                  jmeta = sc._jvm.org.apache.spark.sql.types.Metadata.fromJson(
                      json.dumps(metadata))
                  return Column(getattr(self._jc, "as")(alias[0], jmeta))
              else:
                  return Column(getattr(self._jc, "as")(alias[0]))
          else:
              if metadata:
                  raise ValueError('metadata can only be provided for a single column')
              return Column(getattr(self._jc, "as")(_to_seq(sc, list(alias))))
docs: Returns this column aliased with a new name or names (in the case of expressions that
          return more than one column, such as explode).
  
          :param alias: strings of desired column names (collects all positional arguments passed)
          :param metadata: a dict of information to be stored in ``metadata`` attribute of the
              corresponding :class: `StructField` (optional, keyword only argument)
  
          .. versionchanged:: 2.2
             Added optional ``metadata`` argument.
  
          >>> df.select(df.age.alias("age2")).collect()
          [Row(age2=2), Row(age2=5)]
          >>> df.select(df.age.alias("age3", metadata={'max': 99})).schema['age3'].metadata['max']
          99