class_docstr: The API necessary to provide a new Parquet reader/writer
docstr: Gather metadata about a Parquet Dataset to prepare for a read
  
  This function is called once in the user's Python session to gather
  important metadata about the parquet dataset.
  
  Parameters
  ----------
  fs: FileSystem
  paths: List[str]
      A list of paths to files (or their equivalents)
  categories: list, dict or None
      Column(s) containing categorical data.
  index: str, List[str], or False
      The column name(s) to be used as the index.
      If set to ``None``, pandas metadata (if available) can be used
      to reset the value in this function
  use_nullable_dtypes: boolean
      Whether to use pandas nullable dtypes (like "string" or "Int64")
      where appropriate when reading parquet files.
  gather_statistics: bool
      Whether or not to gather statistics to calculate divisions
      for the output DataFrame collection.
  filters: list
      List of filters to apply, like ``[('x', '>', 0), ...]``.
  **kwargs: dict (of dicts)
      User-specified arguments to pass on to backend.
      Top level key can be used by engine to select appropriate dict.
  
  Returns
  -------
  meta: pandas.DataFrame
      An empty DataFrame object to use for metadata.
      Should have appropriate column names and dtypes but need not have
      any actual data
  statistics: Optional[List[Dict]]
      Either None, if no statistics were found, or a list of dictionaries
      of statistics data, one dict for every partition (see the next
      return value).  The statistics should look like the following:
  
      [
          {'num-rows': 1000, 'columns': [
              {'name': 'id', 'min': 0, 'max': 100},
              {'name': 'x', 'min': 0.0, 'max': 1.0},
              ]},
          ...
      ]
  parts: List[object]
      A list of objects to be passed to ``Engine.read_partition``.
      Each object should represent a piece of data (usually a row-group).
      The type of each object can be anything, as long as the
      engine's read_partition function knows how to interpret it.
docstr_tok: ["Gather","metadata","about","a","Parquet","Dataset","to","prepare","for","a","read","This","function","is","called","once","in","the","user","'s","Python","session","to","gather","important","metadata","about","the","parquet","dataset",".","Parameters","--","--","--","--","--","fs",":","FileSystem","paths",":","List","[","str","]","A","list","of","paths","to","files","(","or","their","equivalents",")","categories",":","list",",","dict","or","None","Column","(","s",")","containing","categorical","data",".","index",":","str",",","List","[","str","]",",","or","False","The","column","name","(","s",")","to","be","used","as","the","index",".","If","set","to","``","None","``",",","pandas","metadata","(","if","available",")","can","be","used","to","reset","the","value","in","this","function","use_nullable_dtypes",":","boolean","Whether","to","use","pandas","nullable","dtypes","(","like","``","string","''","or","``","Int64","''",")","where","appropriate","when","reading","parquet","files",".","gather_statistics",":","bool","Whether","or","not","to","gather","statistics","to","calculate","divisions","for","the","output","DataFrame","collection",".","filters",":","list","List","of","filters","to","apply",",","like","``","[","(","'","x","'",",","'",">","'",",","0",")",",","...","]","``",".","*","*","kwargs",":","dict","(","of","dicts",")","User-specified","arguments","to","pass","on","to","backend",".","Top","level","key","can","be","used","by","engine","to","select","appropriate","dict",".","Returns","--","--","--","-","meta",":","pandas.DataFrame","An","empty","DataFrame","object","to","use","for","metadata",".","Should","have","appropriate","column","names","and","dtypes","but","need","not","have","any","actual","data","statistics",":","Optional","[","List","[","Dict","]","]","Either","None",",","if","no","statistics","were","found",",","or","a","list","of","dictionaries","of","statistics","data",",","one","dict","for","every","partition","(","see","the","next","return","value",")",".","The","statistics","should","look","like","the","following",":","[","{","'num-rows","'",":","1000",",","'columns","'",":","[","{","'name","'",":","'id","'",",","'min","'",":","0",",","'max","'",":","100","}",",","{","'name","'",":","'","x","'",",","'min","'",":","0.0",",","'max","'",":","1.0","}",",","]","}",",","...","]","parts",":","List","[","object","]","A","list","of","objects","to","be","passed","to","``","Engine.read_partition","``",".","Each","object","should","represent","a","piece","of","data","(","usually","a","row-group",")",".","The","type","of","each","object","can","be","anything",",","as","long","as","the","engine","'s","read_partition","function","knows","how","to","interpret","it","."]
code: def read_metadata(
      cls,
      fs,
      paths,
      categories=None,
      index=None,
      use_nullable_dtypes=None,
      dtype_backend=None,
      gather_statistics=None,
      filters=None,
      **kwargs,
  ):
      """Gather metadata about a Parquet Dataset to prepare for a read
  
      This function is called once in the user's Python session to gather
      important metadata about the parquet dataset.
  
      Parameters
      ----------
      fs: FileSystem
      paths: List[str]
          A list of paths to files (or their equivalents)
      categories: list, dict or None
          Column(s) containing categorical data.
      index: str, List[str], or False
          The column name(s) to be used as the index.
          If set to ``None``, pandas metadata (if available) can be used
          to reset the value in this function
      use_nullable_dtypes: boolean
          Whether to use pandas nullable dtypes (like "string" or "Int64")
          where appropriate when reading parquet files.
      gather_statistics: bool
          Whether or not to gather statistics to calculate divisions
          for the output DataFrame collection.
      filters: list
          List of filters to apply, like ``[('x', '>', 0), ...]``.
      **kwargs: dict (of dicts)
          User-specified arguments to pass on to backend.
          Top level key can be used by engine to select appropriate dict.
  
      Returns
      -------
      meta: pandas.DataFrame
          An empty DataFrame object to use for metadata.
          Should have appropriate column names and dtypes but need not have
          any actual data
      statistics: Optional[List[Dict]]
          Either None, if no statistics were found, or a list of dictionaries
          of statistics data, one dict for every partition (see the next
          return value).  The statistics should look like the following:
  
          [
              {'num-rows': 1000, 'columns': [
                  {'name': 'id', 'min': 0, 'max': 100},
                  {'name': 'x', 'min': 0.0, 'max': 1.0},
                  ]},
              ...
          ]
      parts: List[object]
          A list of objects to be passed to ``Engine.read_partition``.
          Each object should represent a piece of data (usually a row-group).
          The type of each object can be anything, as long as the
          engine's read_partition function knows how to interpret it.
      """
      raise NotImplementedError()
  
imports: from __future__ import annotations
  import re
  import warnings
  import numpy
  import pandas
  from fsspec.core import expand_paths_if_needed, get_fs_token_paths, stringify_path
  from fsspec.spec import AbstractFileSystem
  from dask import config
  from dask.dataframe.io.utils import _is_local_fs
  from dask.utils import natural_sort_key, parse_bytes
label_desc: Use image node_id 2 for calling the Engine obj's underlying member method code with example usage: obj.read_metadata(cls, fs, paths, categories, index, use_nullable_dtypes, dtype_backend, gather_statistics, filters) without return types