class_docstr: pandas-on-Spark MultiIndex that corresponds to pandas MultiIndex logically. This might hold
  Spark Column internally.
  
  Parameters
  ----------
  levels : sequence of arrays
      The unique labels for each level.
  codes : sequence of arrays
      Integers for each level designating which label at each location.
  sortorder : optional int
      Level of sortedness (must be lexicographically sorted by that
      level).
  names : optional sequence of objects
      Names for each of the index levels. (name is accepted for compat).
  copy : bool, default False
      Copy the meta-data.
  verify_integrity : bool, default True
      Check that the levels/codes are consistent and valid.
  
  See Also
  --------
  MultiIndex.from_arrays  : Convert list of arrays to MultiIndex.
  MultiIndex.from_product : Create a MultiIndex from the cartesian product
                            of iterables.
  MultiIndex.from_tuples  : Convert list of tuples to a MultiIndex.
  MultiIndex.from_frame   : Make a MultiIndex from a DataFrame.
  Index : A single-level Index.
  
  Examples
  --------
  >>> ps.DataFrame({'a': ['a', 'b', 'c']}, index=[[1, 2, 3], [4, 5, 6]]).index  # doctest: +SKIP
  MultiIndex([(1, 4),
              (2, 5),
              (3, 6)],
             )
  
  >>> ps.DataFrame({'a': [1, 2, 3]}, index=[list('abc'), list('def')]).index  # doctest: +SKIP
  MultiIndex([('a', 'd'),
              ('b', 'e'),
              ('c', 'f')],
             )
class_docstr_tok: ["pandas-on-Spark","MultiIndex","that","corresponds","to","pandas","MultiIndex","logically",".","This","might","hold","Spark","Column","internally",".","Parameters","--","--","--","--","--","levels",":","sequence","of","arrays","The","unique","labels","for","each","level",".","codes",":","sequence","of","arrays","Integers","for","each","level","designating","which","label","at","each","location",".","sortorder",":","optional","int","Level","of","sortedness","(","must","be","lexicographically","sorted","by","that","level",")",".","names",":","optional","sequence","of","objects","Names","for","each","of","the","index","levels",".","(","name","is","accepted","for","compat",")",".","copy",":","bool",",","default","False","Copy","the","meta-data",".","verify_integrity",":","bool",",","default","True","Check","that","the","levels\/codes","are","consistent","and","valid",".","See","Also","--","--","--","--","MultiIndex.from_arrays",":","Convert","list","of","arrays","to","MultiIndex",".","MultiIndex.from_product",":","Create","a","MultiIndex","from","the","cartesian","product","of","iterables",".","MultiIndex.from_tuples",":","Convert","list","of","tuples","to","a","MultiIndex",".","MultiIndex.from_frame",":","Make","a","MultiIndex","from","a","DataFrame",".","Index",":","A","single-level","Index",".","Examples","--","--","--","--",">",">",">","ps.DataFrame","(","{","'","a","'",":","[","'","a","'",",","'","b","'",",","'","c","'","]","}",",","index=","[","[","1",",","2",",","3","]",",","[","4",",","5",",","6","]","]",")",".index","#","doctest",":","+SKIP","MultiIndex","(","[","(","1",",","4",")",",","(","2",",","5",")",",","(","3",",","6",")","]",",",")",">",">",">","ps.DataFrame","(","{","'","a","'",":","[","1",",","2",",","3","]","}",",","index=","[","list","(","'abc","'",")",",","list","(","'def","'",")","]",")",".index","#","doctest",":","+SKIP","MultiIndex","(","[","(","'","a","'",",","'d","'",")",",","(","'","b","'",",","'","e","'",")",",","(","'","c","'",",","'","f","'",")","]",",",")"]
docstr: Return True if the levels of both MultiIndex objects are the same
  
  .. versionadded:: 3.3.0
  
  Examples
  --------
  >>> psmidx1 = ps.MultiIndex.from_tuples([("a", "x"), ("b", "y"), ("c", "z")])
  >>> psmidx2 = ps.MultiIndex.from_tuples([("b", "y"), ("a", "x"), ("c", "z")])
  >>> psmidx1.equal_levels(psmidx2)
  True
  
  >>> psmidx2 = ps.MultiIndex.from_tuples([("a", "x"), ("b", "y"), ("c", "j")])
  >>> psmidx1.equal_levels(psmidx2)
  False
docstr_tok: ["Return","True","if","the","levels","of","both","MultiIndex","objects","are","the","same","..","versionadded",":",":","3.3.0","Examples","--","--","--","--",">",">",">","psmidx1","=","ps.MultiIndex.from_tuples","(","[","(","``","a","''",",","``","x","''",")",",","(","``","b","''",",","``","y","''",")",",","(","``","c","''",",","``","z","''",")","]",")",">",">",">","psmidx2","=","ps.MultiIndex.from_tuples","(","[","(","``","b","''",",","``","y","''",")",",","(","``","a","''",",","``","x","''",")",",","(","``","c","''",",","``","z","''",")","]",")",">",">",">","psmidx1.equal_levels","(","psmidx2",")","True",">",">",">","psmidx2","=","ps.MultiIndex.from_tuples","(","[","(","``","a","''",",","``","x","''",")",",","(","``","b","''",",","``","y","''",")",",","(","``","c","''",",","``","j","''",")","]",")",">",">",">","psmidx1.equal_levels","(","psmidx2",")","False"]
code: def equal_levels(self, other: "MultiIndex") -> bool:
      """
      Return True if the levels of both MultiIndex objects are the same
  
      .. versionadded:: 3.3.0
  
      Examples
      --------
      >>> psmidx1 = ps.MultiIndex.from_tuples([("a", "x"), ("b", "y"), ("c", "z")])
      >>> psmidx2 = ps.MultiIndex.from_tuples([("b", "y"), ("a", "x"), ("c", "z")])
      >>> psmidx1.equal_levels(psmidx2)
      True
  
      >>> psmidx2 = ps.MultiIndex.from_tuples([("a", "x"), ("b", "y"), ("c", "j")])
      >>> psmidx1.equal_levels(psmidx2)
      False
      """
      nlevels = self.nlevels
      if nlevels != other.nlevels:
          return False
  
      self_sdf = self._internal.spark_frame
      other_sdf = other._internal.spark_frame
      subtract_list = []
      for nlevel in range(nlevels):
          self_index_scol = self._internal.index_spark_columns[nlevel]
          other_index_scol = other._internal.index_spark_columns[nlevel]
          self_subtract_other = self_sdf.select(
              self_index_scol
          ).subtract(other_sdf.select(other_index_scol))
          subtract_list.append(self_subtract_other)
  
      unioned_subtracts = reduce(lambda x, y: x.union(y), subtract_list)
      return len(unioned_subtracts.head(1)) == 0
  
imports: from functools import partial, reduce
  from typing import Any, Callable, Iterator, List, Optional, Tuple, Union, cast, no_type_check
  import pandas
  from pandas.api.types import is_hashable, is_list_like
  from pyspark.sql import functions, Column, Window
  from pyspark.sql.types import DataType
  from pyspark.sql.utils import get_column_class
  from pyspark import pandas
  from pyspark.pandas._typing import Label, Name, Scalar
  from pyspark.pandas.exceptions import PandasNotImplementedError
  from pyspark.pandas.frame import DataFrame
  from pyspark.pandas.indexes.base import Index
  from pyspark.pandas.missing.indexes import MissingPandasLikeMultiIndex
  from pyspark.pandas.series import Series, first_series
  from pyspark.pandas.utils import compare_disallow_null, is_name_like_tuple, name_like_string, scol_for, verify_temp_column_name, validate_index_loc, xor
  from pyspark.pandas.internal import InternalField, InternalFrame, NATURAL_ORDER_COLUMN_NAME, SPARK_INDEX_NAME_FORMAT
label_desc: Use image node_id 40 for calling the MultiIndex obj's underlying member method code with example usage: obj.equal_levels(other) and returns: unknown, False