This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch asf-staging
in repository https://gitbox.apache.org/repos/asf/datafusion-python.git


The following commit(s) were added to refs/heads/asf-staging by this push:
     new 0cbaf13  Publish built docs triggered by 
5e32ada2565cebec3df54a1bbf9725f3a434b24d
0cbaf13 is described below

commit 0cbaf13d9de90f9a44038e901ed680e4ce6009fb
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Nov 15 16:27:57 2024 +0000

    Publish built docs triggered by 5e32ada2565cebec3df54a1bbf9725f3a434b24d
---
 _sources/autoapi/datafusion/context/index.rst.txt  |   9 ++++
 _sources/user-guide/io/index.rst.txt               |   1 +
 _sources/user-guide/io/table_provider.rst.txt      |  56 +++++++++++++++++++++
 autoapi/datafusion/catalog/index.html              |   5 ++
 autoapi/datafusion/context/index.html              |  22 ++++++++
 autoapi/datafusion/dataframe/index.html            |   5 ++
 autoapi/datafusion/expr/index.html                 |   5 ++
 autoapi/datafusion/functions/index.html            |   5 ++
 autoapi/datafusion/index.html                      |   5 ++
 autoapi/datafusion/input/base/index.html           |   5 ++
 autoapi/datafusion/input/index.html                |   5 ++
 autoapi/datafusion/input/location/index.html       |   5 ++
 autoapi/datafusion/object_store/index.html         |   5 ++
 autoapi/datafusion/plan/index.html                 |   5 ++
 autoapi/datafusion/record_batch/index.html         |   5 ++
 autoapi/datafusion/substrait/index.html            |   5 ++
 autoapi/datafusion/udf/index.html                  |   5 ++
 autoapi/index.html                                 |   5 ++
 contributor-guide/introduction.html                |   5 ++
 genindex.html                                      |   7 +++
 index.html                                         |   5 ++
 objects.inv                                        | Bin 5606 -> 5647 bytes
 py-modindex.html                                   |   5 ++
 search.html                                        |   5 ++
 searchindex.js                                     |   2 +-
 user-guide/basics.html                             |   5 ++
 user-guide/common-operations/aggregations.html     |  43 +++++++++-------
 user-guide/common-operations/basic-info.html       |  39 +++++++-------
 user-guide/common-operations/expressions.html      |   5 ++
 user-guide/common-operations/functions.html        |  27 ++++++----
 user-guide/common-operations/index.html            |   5 ++
 user-guide/common-operations/joins.html            |   5 ++
 .../common-operations/select-and-filter.html       |   7 ++-
 user-guide/common-operations/udf-and-udfa.html     |   5 ++
 user-guide/common-operations/windows.html          |   7 ++-
 user-guide/configuration.html                      |   5 ++
 user-guide/introduction.html                       |   5 ++
 user-guide/io/arrow.html                           |   5 ++
 user-guide/io/avro.html                            |   5 ++
 user-guide/io/csv.html                             |   5 ++
 user-guide/io/index.html                           |   6 +++
 user-guide/io/json.html                            |   5 ++
 user-guide/io/parquet.html                         |  11 ++--
 .../io/{parquet.html => table_provider.html}       |  53 +++++++++++++------
 user-guide/sql.html                                |  11 ++--
 45 files changed, 376 insertions(+), 70 deletions(-)

diff --git a/_sources/autoapi/datafusion/context/index.rst.txt 
b/_sources/autoapi/datafusion/context/index.rst.txt
index 368ddad..5c228cf 100644
--- a/_sources/autoapi/datafusion/context/index.rst.txt
+++ b/_sources/autoapi/datafusion/context/index.rst.txt
@@ -735,6 +735,15 @@ Module Contents
 
 
 
+   .. py:method:: register_table_provider(name: str, provider: Any) -> None
+
+      Register a table provider.
+
+      This table provider must have a method called 
``__datafusion_table_provider__``
+      which returns a PyCapsule that exposes a ``FFI_TableProvider``.
+
+
+
    .. py:method:: register_udaf(udaf: datafusion.udf.AggregateUDF) -> None
 
       Register a user-defined aggregation function (UDAF) with the context.
diff --git a/_sources/user-guide/io/index.rst.txt 
b/_sources/user-guide/io/index.rst.txt
index 0541132..b885cfe 100644
--- a/_sources/user-guide/io/index.rst.txt
+++ b/_sources/user-guide/io/index.rst.txt
@@ -26,3 +26,4 @@ IO
    csv
    json
    parquet
+   table_provider
diff --git a/_sources/user-guide/io/table_provider.rst.txt 
b/_sources/user-guide/io/table_provider.rst.txt
new file mode 100644
index 0000000..2ff9ae4
--- /dev/null
+++ b/_sources/user-guide/io/table_provider.rst.txt
@@ -0,0 +1,56 @@
+.. Licensed to the Apache Software Foundation (ASF) under one
+.. or more contributor license agreements.  See the NOTICE file
+.. distributed with this work for additional information
+.. regarding copyright ownership.  The ASF licenses this file
+.. to you under the Apache License, Version 2.0 (the
+.. "License"); you may not use this file except in compliance
+.. with the License.  You may obtain a copy of the License at
+
+..   http://www.apache.org/licenses/LICENSE-2.0
+
+.. Unless required by applicable law or agreed to in writing,
+.. software distributed under the License is distributed on an
+.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+.. KIND, either express or implied.  See the License for the
+.. specific language governing permissions and limitations
+.. under the License.
+
+Custom Table Provider
+=====================
+
+If you have a custom data source that you want to integrate with DataFusion, 
you can do so by
+implementing the `TableProvider 
<https://datafusion.apache.org/library-user-guide/custom-table-providers.html>`_
+interface in Rust and then exposing it in Python. To do so,
+you must use DataFusion 43.0.0 or later and expose a `FFI_TableProvider 
<https://crates.io/crates/datafusion-ffi>`_
+via `PyCapsule <https://pyo3.rs/main/doc/pyo3/types/struct.pycapsule>`_.
+
+A complete example can be found in the `examples folder 
<https://github.com/apache/datafusion-python/tree/main/examples>`_.
+
+.. code-block:: rust
+
+    #[pymethods]
+    impl MyTableProvider {
+
+        fn __datafusion_table_provider__<'py>(
+            &self,
+            py: Python<'py>,
+        ) -> PyResult<Bound<'py, PyCapsule>> {
+            let name = CString::new("datafusion_table_provider").unwrap();
+
+            let provider = Arc::new(self.clone())
+                .map_err(|e| PyRuntimeError::new_err(e.to_string()))?;
+            let provider = FFI_TableProvider::new(Arc::new(provider), false);
+
+            PyCapsule::new_bound(py, provider, Some(name.clone()))
+        }
+    }
+
+Once you have this library available, in python you can register your table 
provider
+to the ``SessionContext``.
+
+.. code-block:: python
+
+    provider = MyTableProvider()
+    ctx.register_table_provider("my_table", provider)
+
+    ctx.table("my_table").show()
diff --git a/autoapi/datafusion/catalog/index.html 
b/autoapi/datafusion/catalog/index.html
index a523547..56aef0c 100644
--- a/autoapi/datafusion/catalog/index.html
+++ b/autoapi/datafusion/catalog/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/context/index.html 
b/autoapi/datafusion/context/index.html
index 2ef0e6b..5e83830 100644
--- a/autoapi/datafusion/context/index.html
+++ b/autoapi/datafusion/context/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -910,6 +915,15 @@
        </code>
       </a>
      </li>
+     <li class="toc-h4 nav-item toc-entry">
+      <a class="reference internal nav-link" 
href="#datafusion.context.SessionContext.register_table_provider">
+       <code class="docutils literal notranslate">
+        <span class="pre">
+         SessionContext.register_table_provider()
+        </span>
+       </code>
+      </a>
+     </li>
      <li class="toc-h4 nav-item toc-entry">
       <a class="reference internal nav-link" 
href="#datafusion.context.SessionContext.register_udaf">
        <code class="docutils literal notranslate">
@@ -1945,6 +1959,14 @@ register it into the session using the given name.</p>
 </dl>
 </dd></dl>
 
+<dl class="py method">
+<dt class="sig sig-object py" 
id="datafusion.context.SessionContext.register_table_provider">
+<span class="sig-name descname"><span 
class="pre">register_table_provider</span></span><span 
class="sig-paren">(</span><em class="sig-param"><span class="n"><span 
class="pre">name</span></span><span class="p"><span 
class="pre">:</span></span><span class="w"> </span><span class="n"><span 
class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span 
class="pre">provider</span></span><span class="p"><span 
class="pre">:</span></span><span class="w"> </span><span class="n">< [...]
+<dd><p>Register a table provider.</p>
+<p>This table provider must have a method called <code class="docutils literal 
notranslate"><span class="pre">__datafusion_table_provider__</span></code>
+which returns a PyCapsule that exposes a <code class="docutils literal 
notranslate"><span class="pre">FFI_TableProvider</span></code>.</p>
+</dd></dl>
+
 <dl class="py method">
 <dt class="sig sig-object py" 
id="datafusion.context.SessionContext.register_udaf">
 <span class="sig-name descname"><span 
class="pre">register_udaf</span></span><span class="sig-paren">(</span><em 
class="sig-param"><span class="n"><span class="pre">udaf</span></span><span 
class="p"><span class="pre">:</span></span><span class="w"> </span><span 
class="n"><a class="reference internal" 
href="../udf/index.html#datafusion.udf.AggregateUDF" 
title="datafusion.udf.AggregateUDF"><span 
class="pre">datafusion.udf.AggregateUDF</span></a></span></em><span 
class="sig-paren">)</span>  [...]
diff --git a/autoapi/datafusion/dataframe/index.html 
b/autoapi/datafusion/dataframe/index.html
index ea8f791..3542259 100644
--- a/autoapi/datafusion/dataframe/index.html
+++ b/autoapi/datafusion/dataframe/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/expr/index.html 
b/autoapi/datafusion/expr/index.html
index 1ee6b74..3358f35 100644
--- a/autoapi/datafusion/expr/index.html
+++ b/autoapi/datafusion/expr/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/functions/index.html 
b/autoapi/datafusion/functions/index.html
index 5ccb68a..5b421ff 100644
--- a/autoapi/datafusion/functions/index.html
+++ b/autoapi/datafusion/functions/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/index.html b/autoapi/datafusion/index.html
index 4b37677..240f060 100644
--- a/autoapi/datafusion/index.html
+++ b/autoapi/datafusion/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/input/base/index.html 
b/autoapi/datafusion/input/base/index.html
index 7afd2a8..90b7ba1 100644
--- a/autoapi/datafusion/input/base/index.html
+++ b/autoapi/datafusion/input/base/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/input/index.html 
b/autoapi/datafusion/input/index.html
index b59951e..afabb5c 100644
--- a/autoapi/datafusion/input/index.html
+++ b/autoapi/datafusion/input/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/input/location/index.html 
b/autoapi/datafusion/input/location/index.html
index 76db0da..aca64fd 100644
--- a/autoapi/datafusion/input/location/index.html
+++ b/autoapi/datafusion/input/location/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/object_store/index.html 
b/autoapi/datafusion/object_store/index.html
index 4d9f31c..2c1b3ec 100644
--- a/autoapi/datafusion/object_store/index.html
+++ b/autoapi/datafusion/object_store/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/plan/index.html 
b/autoapi/datafusion/plan/index.html
index a5d25d6..3713b4c 100644
--- a/autoapi/datafusion/plan/index.html
+++ b/autoapi/datafusion/plan/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/record_batch/index.html 
b/autoapi/datafusion/record_batch/index.html
index d6a0131..88db99e 100644
--- a/autoapi/datafusion/record_batch/index.html
+++ b/autoapi/datafusion/record_batch/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/substrait/index.html 
b/autoapi/datafusion/substrait/index.html
index 7475708..01fe042 100644
--- a/autoapi/datafusion/substrait/index.html
+++ b/autoapi/datafusion/substrait/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/datafusion/udf/index.html 
b/autoapi/datafusion/udf/index.html
index be1719e..a632dc2 100644
--- a/autoapi/datafusion/udf/index.html
+++ b/autoapi/datafusion/udf/index.html
@@ -203,6 +203,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" 
href="../../../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/autoapi/index.html b/autoapi/index.html
index b68660c..8534269 100644
--- a/autoapi/index.html
+++ b/autoapi/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/contributor-guide/introduction.html 
b/contributor-guide/introduction.html
index 033b601..08d928b 100644
--- a/contributor-guide/introduction.html
+++ b/contributor-guide/introduction.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/genindex.html b/genindex.html
index 624ff1e..f5bffb6 100644
--- a/genindex.html
+++ b/genindex.html
@@ -201,6 +201,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -1867,6 +1872,8 @@
       <li><a 
href="autoapi/datafusion/context/index.html#datafusion.context.SessionContext.register_record_batches">register_record_batches()
 (datafusion.context.SessionContext method)</a>
 </li>
       <li><a 
href="autoapi/datafusion/context/index.html#datafusion.context.SessionContext.register_table">register_table()
 (datafusion.context.SessionContext method)</a>
+</li>
+      <li><a 
href="autoapi/datafusion/context/index.html#datafusion.context.SessionContext.register_table_provider">register_table_provider()
 (datafusion.context.SessionContext method)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
diff --git a/index.html b/index.html
index 440adad..86e75d0 100644
--- a/index.html
+++ b/index.html
@@ -203,6 +203,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/objects.inv b/objects.inv
index 9b8fa4a..6a86b81 100644
Binary files a/objects.inv and b/objects.inv differ
diff --git a/py-modindex.html b/py-modindex.html
index e5fcf4c..79d243f 100644
--- a/py-modindex.html
+++ b/py-modindex.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/search.html b/search.html
index 80d58a8..0b04e1c 100644
--- a/search.html
+++ b/search.html
@@ -208,6 +208,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="user-guide/io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/searchindex.js b/searchindex.js
index 5e84516..4ae72ad 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"API Reference": [[14, null]], "Aggregate 
Functions": [[18, "aggregate-functions"], [25, "aggregate-functions"], [26, 
"aggregate-functions"]], "Aggregation": [[18, null]], "Arrays": [[20, 
"arrays"]], "Arrow": [[29, null]], "Attributes": [[3, "attributes"], [5, 
"attributes"], [9, "attributes"], [13, "attributes"]], "Available Functions": 
[[26, "available-functions"]], "Avro": [[30, null]], "Basic Operations": [[19, 
null]], "Boolean": [[20, "boolean"]], "CSV" [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"API Reference": [[14, null]], "Aggregate 
Functions": [[18, "aggregate-functions"], [25, "aggregate-functions"], [26, 
"aggregate-functions"]], "Aggregation": [[18, null]], "Arrays": [[20, 
"arrays"]], "Arrow": [[29, null]], "Attributes": [[3, "attributes"], [5, 
"attributes"], [9, "attributes"], [13, "attributes"]], "Available Functions": 
[[26, "available-functions"]], "Avro": [[30, null]], "Basic Operations": [[19, 
null]], "Boolean": [[20, "boolean"]], "CSV" [...]
\ No newline at end of file
diff --git a/user-guide/basics.html b/user-guide/basics.html
index efb5992..c9f93ab 100644
--- a/user-guide/basics.html
+++ b/user-guide/basics.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/common-operations/aggregations.html 
b/user-guide/common-operations/aggregations.html
index 87872f9..833a884 100644
--- a/user-guide/common-operations/aggregations.html
+++ b/user-guide/common-operations/aggregations.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -421,7 +426,7 @@ to form a single summary value. For performing an 
aggregation, DataFusion provid
    <span class="o">...</span><span class="p">:</span>     <span 
class="s2">&quot;pokemon.csv&quot;</span><span class="p">,</span>
    <span class="o">...</span><span class="p">:</span> <span class="p">)</span>
    <span class="o">...</span><span class="p">:</span> 
-<span class="n">Out</span><span class="p">[</span><span 
class="mi">5</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;pokemon.csv&#39;</span><span class="p">,</span> <span 
class="o">&lt;</span><span class="n">http</span><span class="o">.</span><span 
class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f9b46516c10</span><span class="o">&gt;</span><span 
class="p">)</span>
+<span class="n">Out</span><span class="p">[</span><span 
class="mi">5</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;pokemon.csv&#39;</span><span class="p">,</span> <span 
class="o">&lt;</span><span class="n">http</span><span class="o">.</span><span 
class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f83cc069c10</span><span class="o">&gt;</span><span 
class="p">)</span>
 
 <span class="n">In</span> <span class="p">[</span><span 
class="mi">6</span><span class="p">]:</span> <span class="n">ctx</span> <span 
class="o">=</span> <span class="n">SessionContext</span><span 
class="p">()</span>
 
@@ -470,6 +475,8 @@ For grouping the <code class="code docutils literal 
notranslate"><span class="pr
 <span class="o">+----------+-----------+-------------------+-----------+</span>
 <span class="o">|</span> <span class="n">Type</span> <span class="mi">1</span> 
  <span class="o">|</span> <span class="n">Max</span> <span 
class="n">Speed</span> <span class="o">|</span> <span class="n">Avg</span> 
<span class="n">Speed</span>         <span class="o">|</span> <span 
class="n">Min</span> <span class="n">Speed</span> <span class="o">|</span>
 <span class="o">+----------+-----------+-------------------+-----------+</span>
+<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="mi">121</span>       <span class="o">|</span> 
<span class="mf">72.75</span>             <span class="o">|</span> <span 
class="mi">20</span>        <span class="o">|</span>
+<span class="o">|</span> <span class="n">Ice</span>      <span 
class="o">|</span> <span class="mi">95</span>        <span class="o">|</span> 
<span class="mf">90.0</span>              <span class="o">|</span> <span 
class="mi">85</span>        <span class="o">|</span>
 <span class="o">|</span> <span class="n">Grass</span>    <span 
class="o">|</span> <span class="mi">80</span>        <span class="o">|</span> 
<span class="mf">54.23076923076923</span> <span class="o">|</span> <span 
class="mi">30</span>        <span class="o">|</span>
 <span class="o">|</span> <span class="n">Fire</span>     <span 
class="o">|</span> <span class="mi">105</span>       <span class="o">|</span> 
<span class="mf">86.28571428571429</span> <span class="o">|</span> <span 
class="mi">60</span>        <span class="o">|</span>
 <span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="mi">115</span>       <span class="o">|</span> 
<span class="mf">67.25806451612904</span> <span class="o">|</span> <span 
class="mi">15</span>        <span class="o">|</span>
@@ -478,8 +485,6 @@ For grouping the <code class="code docutils literal 
notranslate"><span class="pr
 <span class="o">|</span> <span class="n">Psychic</span>  <span 
class="o">|</span> <span class="mi">150</span>       <span class="o">|</span> 
<span class="mf">99.25</span>             <span class="o">|</span> <span 
class="mi">42</span>        <span class="o">|</span>
 <span class="o">|</span> <span class="n">Rock</span>     <span 
class="o">|</span> <span class="mi">150</span>       <span class="o">|</span> 
<span class="mf">67.5</span>              <span class="o">|</span> <span 
class="mi">20</span>        <span class="o">|</span>
 <span class="o">|</span> <span class="n">Ghost</span>    <span 
class="o">|</span> <span class="mi">130</span>       <span class="o">|</span> 
<span class="mf">103.75</span>            <span class="o">|</span> <span 
class="mi">80</span>        <span class="o">|</span>
-<span class="o">|</span> <span class="n">Dragon</span>   <span 
class="o">|</span> <span class="mi">80</span>        <span class="o">|</span> 
<span class="mf">66.66666666666667</span> <span class="o">|</span> <span 
class="mi">50</span>        <span class="o">|</span>
-<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="mi">121</span>       <span class="o">|</span> 
<span class="mf">72.75</span>             <span class="o">|</span> <span 
class="mi">20</span>        <span class="o">|</span>
 <span class="o">+----------+-----------+-------------------+-----------+</span>
 </pre></div>
 </div>
@@ -562,15 +567,15 @@ Pokemon set. Since there will be many entries of <code 
class="docutils literal n
 <span 
class="o">+----------+--------------------------------------------------+</span>
 <span class="o">|</span> <span class="n">Type</span> <span class="mi">1</span> 
  <span class="o">|</span> <span class="n">Type</span> <span 
class="mi">2</span> <span class="n">List</span>                                 
     <span class="o">|</span>
 <span 
class="o">+----------+--------------------------------------------------+</span>
-<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Fairy</span><span class="p">,</span> <span 
class="p">]</span>                                <span class="o">|</span>
+<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="p">,</span> <span class="n">Fairy</span><span 
class="p">]</span>                                <span class="o">|</span>
 <span class="o">|</span> <span class="n">Ice</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Psychic</span><span class="p">]</span>       
                         <span class="o">|</span>
-<span class="o">|</span> <span class="n">Bug</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Poison</span><span class="p">,</span> <span 
class="p">,</span> <span class="n">Grass</span><span class="p">]</span>         
               <span class="o">|</span>
-<span class="o">|</span> <span class="n">Poison</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Ground</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">,</span> <span 
class="p">]</span>                               <span class="o">|</span>
-<span class="o">|</span> <span class="n">Electric</span> <span 
class="o">|</span> <span class="p">[,</span> <span class="n">Flying</span><span 
class="p">,</span> <span class="n">Steel</span><span class="p">]</span>         
                       <span class="o">|</span>
+<span class="o">|</span> <span class="n">Bug</span>      <span 
class="o">|</span> <span class="p">[,</span> <span class="n">Grass</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">,</span> <span 
class="n">Poison</span><span class="p">]</span>                        <span 
class="o">|</span>
+<span class="o">|</span> <span class="n">Poison</span>   <span 
class="o">|</span> <span class="p">[,</span> <span class="n">Flying</span><span 
class="p">,</span> <span class="n">Ground</span><span class="p">]</span>        
                       <span class="o">|</span>
+<span class="o">|</span> <span class="n">Electric</span> <span 
class="o">|</span> <span class="p">[</span><span class="n">Steel</span><span 
class="p">,</span> <span class="p">,</span> <span class="n">Flying</span><span 
class="p">]</span>                                <span class="o">|</span>
 <span class="o">|</span> <span class="n">Fairy</span>    <span 
class="o">|</span> <span class="p">[]</span>                                    
           <span class="o">|</span>
 <span class="o">|</span> <span class="n">Grass</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Poison</span><span 
class="p">,</span> <span class="p">,</span> <span class="n">Psychic</span><span 
class="p">]</span>                              <span class="o">|</span>
 <span class="o">|</span> <span class="n">Fire</span>     <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Dragon</span><span class="p">,</span> <span 
class="p">]</span>                               <span class="o">|</span>
-<span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="p">[,</span> <span 
class="n">Psychic</span><span class="p">,</span> <span 
class="n">Ice</span><span class="p">,</span> <span class="n">Dark</span><span 
class="p">,</span> <span class="n">Fighting</span><span class="p">,</span> 
<span class="n">Flying</span><span class="p">,</span> <span 
class="n">Poison</span><span class="p">]</span> <span class="o">|</span>
+<span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Poison</span><span 
class="p">,</span> <span class="p">,</span> <span class="n">Dark</span><span 
class="p">,</span> <span class="n">Fighting</span><span class="p">,</span> 
<span class="n">Flying</span><span class="p">,</span> <span 
class="n">Ice</span><span class="p">,</span> <span 
class="n">Psychic</span><span class="p">]</span> <span class="o">|</span>
 <span class="o">|</span> <span class="n">Ground</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Rock</span><span 
class="p">,</span> <span class="p">]</span>                                     
    <span class="o">|</span>
 <span 
class="o">+----------+--------------------------------------------------+</span>
 </pre></div>
@@ -585,15 +590,15 @@ entries entirely removed. The second is we can use the 
<code class="docutils lit
 <span 
class="o">+----------+------------------------------------------------+</span>
 <span class="o">|</span> <span class="n">Type</span> <span class="mi">1</span> 
  <span class="o">|</span> <span class="n">Type</span> <span 
class="mi">2</span> <span class="n">List</span>                                 
   <span class="o">|</span>
 <span 
class="o">+----------+------------------------------------------------+</span>
-<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Fairy</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                        <span class="o">|</span>
-<span class="o">|</span> <span class="n">Ice</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Psychic</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                      <span class="o">|</span>
 <span class="o">|</span> <span class="n">Bug</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Poison</span><span 
class="p">,</span> <span class="n">Grass</span><span class="p">,</span> <span 
class="n">Flying</span><span class="p">]</span>                        <span 
class="o">|</span>
-<span class="o">|</span> <span class="n">Poison</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Ground</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                       <span class="o">|</span>
-<span class="o">|</span> <span class="n">Electric</span> <span 
class="o">|</span> <span class="p">[</span><span class="n">Steel</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                        <span class="o">|</span>
+<span class="o">|</span> <span class="n">Poison</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Ground</span><span class="p">]</span>        
                       <span class="o">|</span>
+<span class="o">|</span> <span class="n">Electric</span> <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Steel</span><span class="p">]</span>         
                       <span class="o">|</span>
+<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Fairy</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                        <span class="o">|</span>
+<span class="o">|</span> <span class="n">Ice</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Psychic</span><span class="p">]</span>       
                       <span class="o">|</span>
 <span class="o">|</span> <span class="n">Grass</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Poison</span><span 
class="p">,</span> <span class="n">Psychic</span><span class="p">]</span>       
                       <span class="o">|</span>
 <span class="o">|</span> <span class="n">Fire</span>     <span 
class="o">|</span> <span class="p">[</span><span class="n">Dragon</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                       <span class="o">|</span>
-<span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Dark</span><span 
class="p">,</span> <span class="n">Ice</span><span class="p">,</span> <span 
class="n">Flying</span><span class="p">,</span> <span 
class="n">Poison</span><span class="p">,</span> <span 
class="n">Fighting</span><span class="p">,</span> <span 
class="n">Psychic</span><span class="p">]</span> <span class="o">|</span>
-<span class="o">|</span> <span class="n">Rock</span>     <span 
class="o">|</span> <span class="p">[</span><span class="n">Water</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">,</span> <span 
class="n">Ground</span><span class="p">]</span>                        <span 
class="o">|</span>
+<span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Ice</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">,</span> <span 
class="n">Dark</span><span class="p">,</span> <span 
class="n">Fighting</span><span class="p">,</span> <span 
class="n">Poison</span><span class="p">,</span> <span 
class="n">Psychic</span><span class="p">]</span> <span class="o">|</span>
+<span class="o">|</span> <span class="n">Rock</span>     <span 
class="o">|</span> <span class="p">[</span><span class="n">Ground</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">,</span> <span 
class="n">Water</span><span class="p">]</span>                        <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Ghost</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Poison</span><span 
class="p">]</span>                                       <span 
class="o">|</span>
 <span 
class="o">+----------+------------------------------------------------+</span>
 
@@ -603,15 +608,15 @@ entries entirely removed. The second is we can use the 
<code class="docutils lit
 <span 
class="o">+----------+------------------------------------------------+</span>
 <span class="o">|</span> <span class="n">Type</span> <span class="mi">1</span> 
  <span class="o">|</span> <span class="n">Type</span> <span 
class="mi">2</span> <span class="n">List</span>                                 
   <span class="o">|</span>
 <span 
class="o">+----------+------------------------------------------------+</span>
-<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Fairy</span><span class="p">]</span>         
                       <span class="o">|</span>
+<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Fairy</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                        <span class="o">|</span>
 <span class="o">|</span> <span class="n">Ice</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Psychic</span><span class="p">]</span>       
                       <span class="o">|</span>
-<span class="o">|</span> <span class="n">Bug</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Poison</span><span 
class="p">,</span> <span class="n">Grass</span><span class="p">,</span> <span 
class="n">Flying</span><span class="p">]</span>                        <span 
class="o">|</span>
+<span class="o">|</span> <span class="n">Bug</span>      <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Grass</span><span class="p">,</span> <span 
class="n">Poison</span><span class="p">]</span>                        <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Poison</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Ground</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                       <span class="o">|</span>
 <span class="o">|</span> <span class="n">Electric</span> <span 
class="o">|</span> <span class="p">[</span><span class="n">Steel</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">]</span>        
                        <span class="o">|</span>
 <span class="o">|</span> <span class="n">Fairy</span>    <span 
class="o">|</span>                                                <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Grass</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Psychic</span><span 
class="p">,</span> <span class="n">Poison</span><span class="p">]</span>        
                      <span class="o">|</span>
 <span class="o">|</span> <span class="n">Fire</span>     <span 
class="o">|</span> <span class="p">[</span><span class="n">Flying</span><span 
class="p">,</span> <span class="n">Dragon</span><span class="p">]</span>        
                       <span class="o">|</span>
-<span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Fighting</span><span 
class="p">,</span> <span class="n">Dark</span><span class="p">,</span> <span 
class="n">Poison</span><span class="p">,</span> <span class="n">Ice</span><span 
class="p">,</span> <span class="n">Psychic</span><span class="p">,</span> <span 
class="n">Flying</span><span class="p">]</span> <span class="o">|</span>
+<span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Dark</span><span 
class="p">,</span> <span class="n">Flying</span><span class="p">,</span> <span 
class="n">Ice</span><span class="p">,</span> <span class="n">Poison</span><span 
class="p">,</span> <span class="n">Fighting</span><span class="p">,</span> 
<span class="n">Psychic</span><span class="p">]</span> <span class="o">|</span>
 <span class="o">|</span> <span class="n">Ground</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Rock</span><span 
class="p">]</span>                                         <span 
class="o">|</span>
 <span 
class="o">+----------+------------------------------------------------+</span>
 </pre></div>
@@ -696,12 +701,12 @@ aggregate function without filtering rows from the entire 
DataFrame.</p>
 <span class="o">|</span> <span class="n">Poison</span>   <span 
class="o">|</span> <span class="mf">58.785714285714285</span> <span 
class="o">|</span> <span class="mf">48.0</span>                 <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Electric</span> <span 
class="o">|</span> <span class="mf">98.88888888888889</span>  <span 
class="o">|</span> <span class="mf">72.5</span>                 <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Fairy</span>    <span 
class="o">|</span> <span class="mf">47.5</span>               <span 
class="o">|</span> <span class="mf">35.0</span>                 <span 
class="o">|</span>
-<span class="o">|</span> <span class="n">Normal</span>   <span 
class="o">|</span> <span class="mf">72.75</span>              <span 
class="o">|</span> <span class="mf">52.8</span>                 <span 
class="o">|</span>
-<span class="o">|</span> <span class="n">Ice</span>      <span 
class="o">|</span> <span class="mf">90.0</span>               <span 
class="o">|</span>                      <span class="o">|</span>
 <span class="o">|</span> <span class="n">Grass</span>    <span 
class="o">|</span> <span class="mf">54.23076923076923</span>  <span 
class="o">|</span> <span class="mf">42.5</span>                 <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Fire</span>     <span 
class="o">|</span> <span class="mf">86.28571428571429</span>  <span 
class="o">|</span> <span class="mf">65.0</span>                 <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Water</span>    <span 
class="o">|</span> <span class="mf">67.25806451612904</span>  <span 
class="o">|</span> <span class="mf">63.833333333333336</span>   <span 
class="o">|</span>
 <span class="o">|</span> <span class="n">Ground</span>   <span 
class="o">|</span> <span class="mf">58.125</span>             <span 
class="o">|</span>                      <span class="o">|</span>
+<span class="o">|</span> <span class="n">Fighting</span> <span 
class="o">|</span> <span class="mf">66.14285714285714</span>  <span 
class="o">|</span>                      <span class="o">|</span>
+<span class="o">|</span> <span class="n">Psychic</span>  <span 
class="o">|</span> <span class="mf">99.25</span>              <span 
class="o">|</span> <span class="mf">81.75</span>                <span 
class="o">|</span>
 <span class="o">+----------+--------------------+----------------------+</span>
 </pre></div>
 </div>
diff --git a/user-guide/common-operations/basic-info.html 
b/user-guide/common-operations/basic-info.html
index 80c0acd..4d01001 100644
--- a/user-guide/common-operations/basic-info.html
+++ b/user-guide/common-operations/basic-info.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -389,11 +394,11 @@
 <span class="o">+-----+---------+--------+--------+</span>
 <span class="o">|</span> <span class="n">nrs</span> <span class="o">|</span> 
<span class="n">names</span>   <span class="o">|</span> <span 
class="n">random</span> <span class="o">|</span> <span class="n">groups</span> 
<span class="o">|</span>
 <span class="o">+-----+---------+--------+--------+</span>
-<span class="o">|</span> <span class="mi">1</span>   <span class="o">|</span> 
<span class="n">python</span>  <span class="o">|</span> <span 
class="mi">222</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
-<span class="o">|</span> <span class="mi">2</span>   <span class="o">|</span> 
<span class="n">ruby</span>    <span class="o">|</span> <span 
class="mi">673</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
-<span class="o">|</span> <span class="mi">3</span>   <span class="o">|</span> 
<span class="n">java</span>    <span class="o">|</span> <span 
class="mi">469</span>    <span class="o">|</span> <span class="n">B</span>      
<span class="o">|</span>
-<span class="o">|</span> <span class="mi">4</span>   <span class="o">|</span> 
<span class="n">haskell</span> <span class="o">|</span> <span 
class="mi">891</span>    <span class="o">|</span> <span class="n">C</span>      
<span class="o">|</span>
-<span class="o">|</span> <span class="mi">5</span>   <span class="o">|</span> 
<span class="n">go</span>      <span class="o">|</span> <span 
class="mi">640</span>    <span class="o">|</span> <span class="n">B</span>      
<span class="o">|</span>
+<span class="o">|</span> <span class="mi">1</span>   <span class="o">|</span> 
<span class="n">python</span>  <span class="o">|</span> <span 
class="mi">558</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
+<span class="o">|</span> <span class="mi">2</span>   <span class="o">|</span> 
<span class="n">ruby</span>    <span class="o">|</span> <span 
class="mi">690</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
+<span class="o">|</span> <span class="mi">3</span>   <span class="o">|</span> 
<span class="n">java</span>    <span class="o">|</span> <span 
class="mi">138</span>    <span class="o">|</span> <span class="n">B</span>      
<span class="o">|</span>
+<span class="o">|</span> <span class="mi">4</span>   <span class="o">|</span> 
<span class="n">haskell</span> <span class="o">|</span> <span 
class="mi">134</span>    <span class="o">|</span> <span class="n">C</span>      
<span class="o">|</span>
+<span class="o">|</span> <span class="mi">5</span>   <span class="o">|</span> 
<span class="n">go</span>      <span class="o">|</span> <span 
class="mi">227</span>    <span class="o">|</span> <span class="n">B</span>      
<span class="o">|</span>
 <span class="o">+-----+---------+--------+--------+</span>
 </pre></div>
 </div>
@@ -404,8 +409,8 @@
 <span class="o">+-----+--------+--------+--------+</span>
 <span class="o">|</span> <span class="n">nrs</span> <span class="o">|</span> 
<span class="n">names</span>  <span class="o">|</span> <span 
class="n">random</span> <span class="o">|</span> <span class="n">groups</span> 
<span class="o">|</span>
 <span class="o">+-----+--------+--------+--------+</span>
-<span class="o">|</span> <span class="mi">1</span>   <span class="o">|</span> 
<span class="n">python</span> <span class="o">|</span> <span 
class="mi">222</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
-<span class="o">|</span> <span class="mi">2</span>   <span class="o">|</span> 
<span class="n">ruby</span>   <span class="o">|</span> <span 
class="mi">673</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
+<span class="o">|</span> <span class="mi">1</span>   <span class="o">|</span> 
<span class="n">python</span> <span class="o">|</span> <span 
class="mi">558</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
+<span class="o">|</span> <span class="mi">2</span>   <span class="o">|</span> 
<span class="n">ruby</span>   <span class="o">|</span> <span 
class="mi">690</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
 <span class="o">+-----+--------+--------+--------+</span>
 </pre></div>
 </div>
@@ -423,11 +428,11 @@ passing them to an Arrow table, and then converting them 
to a pandas DataFrame.<
 <div class="highlight-ipython notranslate"><div 
class="highlight"><pre><span></span><span class="n">In</span> <span 
class="p">[</span><span class="mi">8</span><span class="p">]:</span> <span 
class="n">df</span><span class="o">.</span><span 
class="n">to_pandas</span><span class="p">()</span>
 <span class="n">Out</span><span class="p">[</span><span 
class="mi">8</span><span class="p">]:</span> 
    <span class="n">nrs</span>    <span class="n">names</span>  <span 
class="n">random</span> <span class="n">groups</span>
-<span class="mi">0</span>    <span class="mi">1</span>   <span 
class="n">python</span>     <span class="mi">222</span>      <span 
class="n">A</span>
-<span class="mi">1</span>    <span class="mi">2</span>     <span 
class="n">ruby</span>     <span class="mi">673</span>      <span 
class="n">A</span>
-<span class="mi">2</span>    <span class="mi">3</span>     <span 
class="n">java</span>     <span class="mi">469</span>      <span 
class="n">B</span>
-<span class="mi">3</span>    <span class="mi">4</span>  <span 
class="n">haskell</span>     <span class="mi">891</span>      <span 
class="n">C</span>
-<span class="mi">4</span>    <span class="mi">5</span>       <span 
class="n">go</span>     <span class="mi">640</span>      <span 
class="n">B</span>
+<span class="mi">0</span>    <span class="mi">1</span>   <span 
class="n">python</span>     <span class="mi">558</span>      <span 
class="n">A</span>
+<span class="mi">1</span>    <span class="mi">2</span>     <span 
class="n">ruby</span>     <span class="mi">690</span>      <span 
class="n">A</span>
+<span class="mi">2</span>    <span class="mi">3</span>     <span 
class="n">java</span>     <span class="mi">138</span>      <span 
class="n">B</span>
+<span class="mi">3</span>    <span class="mi">4</span>  <span 
class="n">haskell</span>     <span class="mi">134</span>      <span 
class="n">C</span>
+<span class="mi">4</span>    <span class="mi">5</span>       <span 
class="n">go</span>     <span class="mi">227</span>      <span 
class="n">B</span>
 </pre></div>
 </div>
 <p><a class="reference internal" 
href="../../autoapi/datafusion/dataframe/index.html#datafusion.dataframe.DataFrame.describe"
 title="datafusion.dataframe.DataFrame.describe"><code class="xref py py-func 
docutils literal notranslate"><span class="pre">describe()</span></code></a> 
shows a quick statistic summary of your data:</p>
@@ -439,11 +444,11 @@ passing them to an Arrow table, and then converting them 
to a pandas DataFrame.<
 <span 
class="o">+------------+--------------------+-------+--------------------+--------+</span>
 <span class="o">|</span> <span class="n">count</span>      <span 
class="o">|</span> <span class="mf">5.0</span>                <span 
class="o">|</span> <span class="mi">5</span>     <span class="o">|</span> <span 
class="mf">5.0</span>                <span class="o">|</span> <span 
class="mi">5</span>      <span class="o">|</span>
 <span class="o">|</span> <span class="n">null_count</span> <span 
class="o">|</span> <span class="mf">0.0</span>                <span 
class="o">|</span> <span class="mi">0</span>     <span class="o">|</span> <span 
class="mf">0.0</span>                <span class="o">|</span> <span 
class="mi">0</span>      <span class="o">|</span>
-<span class="o">|</span> <span class="n">mean</span>       <span 
class="o">|</span> <span class="mf">3.0</span>                <span 
class="o">|</span> <span class="n">null</span>  <span class="o">|</span> <span 
class="mf">579.0</span>              <span class="o">|</span> <span 
class="n">null</span>   <span class="o">|</span>
-<span class="o">|</span> <span class="n">std</span>        <span 
class="o">|</span> <span class="mf">1.5811388300841898</span> <span 
class="o">|</span> <span class="n">null</span>  <span class="o">|</span> <span 
class="mf">249.72484858339587</span> <span class="o">|</span> <span 
class="n">null</span>   <span class="o">|</span>
-<span class="o">|</span> <span class="nb">min</span>        <span 
class="o">|</span> <span class="mf">1.0</span>                <span 
class="o">|</span> <span class="n">go</span>    <span class="o">|</span> <span 
class="mf">222.0</span>              <span class="o">|</span> <span 
class="n">A</span>      <span class="o">|</span>
-<span class="o">|</span> <span class="nb">max</span>        <span 
class="o">|</span> <span class="mf">5.0</span>                <span 
class="o">|</span> <span class="n">ruby</span>  <span class="o">|</span> <span 
class="mf">891.0</span>              <span class="o">|</span> <span 
class="n">C</span>      <span class="o">|</span>
-<span class="o">|</span> <span class="n">median</span>     <span 
class="o">|</span> <span class="mf">3.0</span>                <span 
class="o">|</span> <span class="n">null</span>  <span class="o">|</span> <span 
class="mf">640.0</span>              <span class="o">|</span> <span 
class="n">null</span>   <span class="o">|</span>
+<span class="o">|</span> <span class="n">mean</span>       <span 
class="o">|</span> <span class="mf">3.0</span>                <span 
class="o">|</span> <span class="n">null</span>  <span class="o">|</span> <span 
class="mf">349.4</span>              <span class="o">|</span> <span 
class="n">null</span>   <span class="o">|</span>
+<span class="o">|</span> <span class="n">std</span>        <span 
class="o">|</span> <span class="mf">1.5811388300841898</span> <span 
class="o">|</span> <span class="n">null</span>  <span class="o">|</span> <span 
class="mf">257.67770567125126</span> <span class="o">|</span> <span 
class="n">null</span>   <span class="o">|</span>
+<span class="o">|</span> <span class="nb">min</span>        <span 
class="o">|</span> <span class="mf">1.0</span>                <span 
class="o">|</span> <span class="n">go</span>    <span class="o">|</span> <span 
class="mf">134.0</span>              <span class="o">|</span> <span 
class="n">A</span>      <span class="o">|</span>
+<span class="o">|</span> <span class="nb">max</span>        <span 
class="o">|</span> <span class="mf">5.0</span>                <span 
class="o">|</span> <span class="n">ruby</span>  <span class="o">|</span> <span 
class="mf">690.0</span>              <span class="o">|</span> <span 
class="n">C</span>      <span class="o">|</span>
+<span class="o">|</span> <span class="n">median</span>     <span 
class="o">|</span> <span class="mf">3.0</span>                <span 
class="o">|</span> <span class="n">null</span>  <span class="o">|</span> <span 
class="mf">227.0</span>              <span class="o">|</span> <span 
class="n">null</span>   <span class="o">|</span>
 <span 
class="o">+------------+--------------------+-------+--------------------+--------+</span>
 </pre></div>
 </div>
diff --git a/user-guide/common-operations/expressions.html 
b/user-guide/common-operations/expressions.html
index 6bd6921..97123f6 100644
--- a/user-guide/common-operations/expressions.html
+++ b/user-guide/common-operations/expressions.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/common-operations/functions.html 
b/user-guide/common-operations/functions.html
index 2e0cec5..2498299 100644
--- a/user-guide/common-operations/functions.html
+++ b/user-guide/common-operations/functions.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -410,7 +415,7 @@ In here we will cover some of the more popular use cases. 
If you want to view al
    <span class="o">...</span><span class="p">:</span> <span 
class="s2">&quot;pokemon.csv&quot;</span><span class="p">,</span>
    <span class="o">...</span><span class="p">:</span> <span class="p">)</span>
    <span class="o">...</span><span class="p">:</span> 
-<span class="n">Out</span><span class="p">[</span><span 
class="mi">3</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;pokemon.csv&#39;</span><span class="p">,</span> <span 
class="o">&lt;</span><span class="n">http</span><span class="o">.</span><span 
class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f9b462399d0</span><span class="o">&gt;</span><span 
class="p">)</span>
+<span class="n">Out</span><span class="p">[</span><span 
class="mi">3</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;pokemon.csv&#39;</span><span class="p">,</span> <span 
class="o">&lt;</span><span class="n">http</span><span class="o">.</span><span 
class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f83c757ee90</span><span class="o">&gt;</span><span 
class="p">)</span>
 
 <span class="n">In</span> <span class="p">[</span><span 
class="mi">4</span><span class="p">]:</span> <span class="n">ctx</span> <span 
class="o">=</span> <span class="n">SessionContext</span><span 
class="p">()</span>
 
@@ -484,16 +489,16 @@ In here we will cover some of the more popular use cases. 
If you want to view al
 <span class="o">+--------------------------------+</span>
 <span class="o">|</span> <span class="n">now</span><span class="p">()</span>   
                       <span class="o">|</span>
 <span class="o">+--------------------------------+</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">12</span><span class="n">T11</span><span class="p">:</span><span 
class="mi">24</span><span class="p">:</span><span 
class="mf">49.920770025</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2024</span><span 
class="o">-</span><span class="mi">11</span><span class="o">-</span><span 
class="mi">15</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">27</span><span class="p">:</span><span 
class="mf">49.682334692</span><span class="n">Z</span> <span class="o">|</span>
 <span class="o">+--------------------------------+</span>
 </pre></div>
 </div>
diff --git a/user-guide/common-operations/index.html 
b/user-guide/common-operations/index.html
index eae847c..dde8d3b 100644
--- a/user-guide/common-operations/index.html
+++ b/user-guide/common-operations/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/common-operations/joins.html 
b/user-guide/common-operations/joins.html
index 435c096..45b07f9 100644
--- a/user-guide/common-operations/joins.html
+++ b/user-guide/common-operations/joins.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/common-operations/select-and-filter.html 
b/user-guide/common-operations/select-and-filter.html
index 9d07a0b..f6c40e7 100644
--- a/user-guide/common-operations/select-and-filter.html
+++ b/user-guide/common-operations/select-and-filter.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -378,7 +383,7 @@
 <span class="n">In</span> <span class="p">[</span><span 
class="mi">3</span><span class="p">]:</span> <span class="n">urllib</span><span 
class="o">.</span><span class="n">request</span><span class="o">.</span><span 
class="n">urlretrieve</span><span class="p">(</span><span 
class="s2">&quot;https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2021-01.parquet&quot;</span><span
 class="p">,</span>
    <span class="o">...</span><span class="p">:</span>                          
  <span class="s2">&quot;yellow_trip_data.parquet&quot;</span><span 
class="p">)</span>
    <span class="o">...</span><span class="p">:</span> 
-<span class="n">Out</span><span class="p">[</span><span 
class="mi">3</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;yellow_trip_data.parquet&#39;</span><span class="p">,</span> 
<span class="o">&lt;</span><span class="n">http</span><span 
class="o">.</span><span class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f9b46292b10</span><span class="o">&gt;</span><span 
class="p">)</span>
+<span class="n">Out</span><span class="p">[</span><span 
class="mi">3</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;yellow_trip_data.parquet&#39;</span><span class="p">,</span> 
<span class="o">&lt;</span><span class="n">http</span><span 
class="o">.</span><span class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f83e7f02ad0</span><span class="o">&gt;</span><span 
class="p">)</span>
 
 <span class="n">In</span> <span class="p">[</span><span 
class="mi">4</span><span class="p">]:</span> <span class="n">ctx</span> <span 
class="o">=</span> <span class="n">SessionContext</span><span 
class="p">()</span>
 
diff --git a/user-guide/common-operations/udf-and-udfa.html 
b/user-guide/common-operations/udf-and-udfa.html
index faa7a5f..75908be 100644
--- a/user-guide/common-operations/udf-and-udfa.html
+++ b/user-guide/common-operations/udf-and-udfa.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/common-operations/windows.html 
b/user-guide/common-operations/windows.html
index f5aa9cd..87c65dc 100644
--- a/user-guide/common-operations/windows.html
+++ b/user-guide/common-operations/windows.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="../io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -428,7 +433,7 @@ provides a single value for multiple rows.</p>
    <span class="o">...</span><span class="p">:</span>     <span 
class="s2">&quot;pokemon.csv&quot;</span><span class="p">,</span>
    <span class="o">...</span><span class="p">:</span> <span class="p">)</span>
    <span class="o">...</span><span class="p">:</span> 
-<span class="n">Out</span><span class="p">[</span><span 
class="mi">5</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;pokemon.csv&#39;</span><span class="p">,</span> <span 
class="o">&lt;</span><span class="n">http</span><span class="o">.</span><span 
class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f9b4416b410</span><span class="o">&gt;</span><span 
class="p">)</span>
+<span class="n">Out</span><span class="p">[</span><span 
class="mi">5</span><span class="p">]:</span> <span class="p">(</span><span 
class="s1">&#39;pokemon.csv&#39;</span><span class="p">,</span> <span 
class="o">&lt;</span><span class="n">http</span><span class="o">.</span><span 
class="n">client</span><span class="o">.</span><span 
class="n">HTTPMessage</span> <span class="n">at</span> <span 
class="mh">0x7f83a5fb53d0</span><span class="o">&gt;</span><span 
class="p">)</span>
 
 <span class="n">In</span> <span class="p">[</span><span 
class="mi">6</span><span class="p">]:</span> <span class="n">ctx</span> <span 
class="o">=</span> <span class="n">SessionContext</span><span 
class="p">()</span>
 
diff --git a/user-guide/configuration.html b/user-guide/configuration.html
index 105bc06..5fafa94 100644
--- a/user-guide/configuration.html
+++ b/user-guide/configuration.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/introduction.html b/user-guide/introduction.html
index 9eef9b0..c1320db 100644
--- a/user-guide/introduction.html
+++ b/user-guide/introduction.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/io/arrow.html b/user-guide/io/arrow.html
index c016bb6..fbeb5a1 100644
--- a/user-guide/io/arrow.html
+++ b/user-guide/io/arrow.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/io/avro.html b/user-guide/io/avro.html
index 3921245..5076d0b 100644
--- a/user-guide/io/avro.html
+++ b/user-guide/io/avro.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/io/csv.html b/user-guide/io/csv.html
index c127ccc..fe74a42 100644
--- a/user-guide/io/csv.html
+++ b/user-guide/io/csv.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/io/index.html b/user-guide/io/index.html
index 04b30a8..1eb9815 100644
--- a/user-guide/io/index.html
+++ b/user-guide/io/index.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -379,6 +384,7 @@
 <li class="toctree-l1"><a class="reference internal" 
href="csv.html">CSV</a></li>
 <li class="toctree-l1"><a class="reference internal" 
href="json.html">JSON</a></li>
 <li class="toctree-l1"><a class="reference internal" 
href="parquet.html">Parquet</a></li>
+<li class="toctree-l1"><a class="reference internal" 
href="table_provider.html">Custom Table Provider</a></li>
 </ul>
 </div>
 </section>
diff --git a/user-guide/io/json.html b/user-guide/io/json.html
index 3196841..2ffcc62 100644
--- a/user-guide/io/json.html
+++ b/user-guide/io/json.html
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
diff --git a/user-guide/io/parquet.html b/user-guide/io/parquet.html
index b9f84ee..d2aa45a 100644
--- a/user-guide/io/parquet.html
+++ b/user-guide/io/parquet.html
@@ -34,7 +34,7 @@
     <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
     <link rel="index" title="Index" href="../../genindex.html" />
     <link rel="search" title="Search" href="../../search.html" />
-    <link rel="next" title="SQL" href="../sql.html" />
+    <link rel="next" title="Custom Table Provider" href="table_provider.html" 
/>
     <link rel="prev" title="JSON" href="json.html" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="docsearch:language" content="en">
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1">
@@ -395,10 +400,10 @@
             <p class="prev-next-title">JSON</p>
         </div>
     </a>
-    <a class='right-next' id="next-link" href="../sql.html" title="next page">
+    <a class='right-next' id="next-link" href="table_provider.html" 
title="next page">
     <div class="prev-next-info">
         <p class="prev-next-subtitle">next</p>
-        <p class="prev-next-title">SQL</p>
+        <p class="prev-next-title">Custom Table Provider</p>
     </div>
     <i class="fas fa-angle-right"></i>
     </a>
diff --git a/user-guide/io/parquet.html b/user-guide/io/table_provider.html
similarity index 68%
copy from user-guide/io/parquet.html
copy to user-guide/io/table_provider.html
index b9f84ee..f35d71c 100644
--- a/user-guide/io/parquet.html
+++ b/user-guide/io/table_provider.html
@@ -5,7 +5,7 @@
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" 
/><meta name="viewport" content="width=device-width, initial-scale=1" />
 
-    <title>Parquet &#8212; Apache Arrow DataFusion  documentation</title>
+    <title>Custom Table Provider &#8212; Apache Arrow DataFusion  
documentation</title>
     
     <link href="../../_static/styles/theme.css?digest=1999514e3f237ded88cf" 
rel="stylesheet">
 <link 
href="../../_static/styles/pydata-sphinx-theme.css?digest=1999514e3f237ded88cf" 
rel="stylesheet">
@@ -35,7 +35,7 @@
     <link rel="index" title="Index" href="../../genindex.html" />
     <link rel="search" title="Search" href="../../search.html" />
     <link rel="next" title="SQL" href="../sql.html" />
-    <link rel="prev" title="JSON" href="json.html" />
+    <link rel="prev" title="Parquet" href="parquet.html" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="docsearch:language" content="en">
     
@@ -199,9 +199,14 @@
      JSON
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="parquet.html">
+     Parquet
+    </a>
+   </li>
    <li class="toctree-l2 current active">
     <a class="current reference internal" href="#">
-     Parquet
+     Custom Table Provider
     </a>
    </li>
   </ul>
@@ -366,18 +371,38 @@
               
               <div>
                 
-  <section id="parquet">
-<h1>Parquet<a class="headerlink" href="#parquet" title="Link to this 
heading">¶</a></h1>
-<p>It is quite simple to read a parquet file using the <a class="reference 
internal" 
href="../../autoapi/datafusion/context/index.html#datafusion.context.SessionContext.read_parquet"
 title="datafusion.context.SessionContext.read_parquet"><code class="xref py 
py-func docutils literal notranslate"><span 
class="pre">read_parquet()</span></code></a> function.</p>
-<div class="highlight-python notranslate"><div 
class="highlight"><pre><span></span><span class="kn">from</span> <span 
class="nn">datafusion</span> <span class="kn">import</span> <span 
class="n">SessionContext</span>
+  <section id="custom-table-provider">
+<h1>Custom Table Provider<a class="headerlink" href="#custom-table-provider" 
title="Link to this heading">¶</a></h1>
+<p>If you have a custom data source that you want to integrate with 
DataFusion, you can do so by
+implementing the <a class="reference external" 
href="https://datafusion.apache.org/library-user-guide/custom-table-providers.html";>TableProvider</a>
+interface in Rust and then exposing it in Python. To do so,
+you must use DataFusion 43.0.0 or later and expose a <a class="reference 
external" href="https://crates.io/crates/datafusion-ffi";>FFI_TableProvider</a>
+via <a class="reference external" 
href="https://pyo3.rs/main/doc/pyo3/types/struct.pycapsule";>PyCapsule</a>.</p>
+<p>A complete example can be found in the <a class="reference external" 
href="https://github.com/apache/datafusion-python/tree/main/examples";>examples 
folder</a>.</p>
+<div class="highlight-rust notranslate"><div 
class="highlight"><pre><span></span><span class="cp">#[pymethods]</span>
+<span class="k">impl</span><span class="w"> </span><span 
class="n">MyTableProvider</span><span class="w"> </span><span class="p">{</span>
+
+<span class="w">    </span><span class="k">fn</span><span class="w"> 
</span><span class="nf">__datafusion_table_provider__</span><span 
class="o">&lt;&#39;</span><span class="na">py</span><span 
class="o">&gt;</span><span class="p">(</span>
+<span class="w">        </span><span class="o">&amp;</span><span 
class="bp">self</span><span class="p">,</span>
+<span class="w">        </span><span class="n">py</span><span 
class="p">:</span><span class="w"> </span><span class="nc">Python</span><span 
class="o">&lt;&#39;</span><span class="na">py</span><span 
class="o">&gt;</span><span class="p">,</span>
+<span class="w">    </span><span class="p">)</span><span class="w"> 
</span><span class="p">-&gt;</span><span class="w"> </span><span 
class="nc">PyResult</span><span class="o">&lt;</span><span 
class="n">Bound</span><span class="o">&lt;&#39;</span><span 
class="na">py</span><span class="p">,</span><span class="w"> </span><span 
class="n">PyCapsule</span><span class="o">&gt;&gt;</span><span class="w"> 
</span><span class="p">{</span>
+<span class="w">        </span><span class="kd">let</span><span class="w"> 
</span><span class="n">name</span><span class="w"> </span><span 
class="o">=</span><span class="w"> </span><span class="n">CString</span><span 
class="p">::</span><span class="n">new</span><span class="p">(</span><span 
class="s">&quot;datafusion_table_provider&quot;</span><span 
class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
 
-<span class="n">ctx</span> <span class="o">=</span> <span 
class="n">SessionContext</span><span class="p">()</span>
-<span class="n">df</span> <span class="o">=</span> <span 
class="n">ctx</span><span class="o">.</span><span 
class="n">read_parquet</span><span class="p">(</span><span 
class="s2">&quot;file.parquet&quot;</span><span class="p">)</span>
+<span class="w">        </span><span class="kd">let</span><span class="w"> 
</span><span class="n">provider</span><span class="w"> </span><span 
class="o">=</span><span class="w"> </span><span class="n">Arc</span><span 
class="p">::</span><span class="n">new</span><span class="p">(</span><span 
class="bp">self</span><span class="p">.</span><span class="n">clone</span><span 
class="p">())</span>
+<span class="w">            </span><span class="p">.</span><span 
class="n">map_err</span><span class="p">(</span><span class="o">|</span><span 
class="n">e</span><span class="o">|</span><span class="w"> </span><span 
class="n">PyRuntimeError</span><span class="p">::</span><span 
class="n">new_err</span><span class="p">(</span><span class="n">e</span><span 
class="p">.</span><span class="n">to_string</span><span 
class="p">()))</span><span class="o">?</span><span class="p">;</span>
+<span class="w">        </span><span class="kd">let</span><span class="w"> 
</span><span class="n">provider</span><span class="w"> </span><span 
class="o">=</span><span class="w"> </span><span 
class="n">FFI_TableProvider</span><span class="p">::</span><span 
class="n">new</span><span class="p">(</span><span class="n">Arc</span><span 
class="p">::</span><span class="n">new</span><span class="p">(</span><span 
class="n">provider</span><span class="p">),</span><span class="w"> </span><span 
class [...]
+
+<span class="w">        </span><span class="n">PyCapsule</span><span 
class="p">::</span><span class="n">new_bound</span><span 
class="p">(</span><span class="n">py</span><span class="p">,</span><span 
class="w"> </span><span class="n">provider</span><span class="p">,</span><span 
class="w"> </span><span class="nb">Some</span><span class="p">(</span><span 
class="n">name</span><span class="p">.</span><span class="n">clone</span><span 
class="p">()))</span>
+<span class="w">    </span><span class="p">}</span>
+<span class="p">}</span>
 </pre></div>
 </div>
-<p>An alternative is to use <a class="reference internal" 
href="../../autoapi/datafusion/context/index.html#datafusion.context.SessionContext.register_parquet"
 title="datafusion.context.SessionContext.register_parquet"><code class="xref 
py py-func docutils literal notranslate"><span 
class="pre">register_parquet()</span></code></a></p>
-<div class="highlight-python notranslate"><div 
class="highlight"><pre><span></span><span class="n">ctx</span><span 
class="o">.</span><span class="n">register_parquet</span><span 
class="p">(</span><span class="s2">&quot;file&quot;</span><span 
class="p">,</span> <span class="s2">&quot;file.parquet&quot;</span><span 
class="p">)</span>
-<span class="n">df</span> <span class="o">=</span> <span 
class="n">ctx</span><span class="o">.</span><span class="n">table</span><span 
class="p">(</span><span class="s2">&quot;file&quot;</span><span 
class="p">)</span>
+<p>Once you have this library available, in python you can register your table 
provider
+to the <code class="docutils literal notranslate"><span 
class="pre">SessionContext</span></code>.</p>
+<div class="highlight-python notranslate"><div 
class="highlight"><pre><span></span><span class="n">provider</span> <span 
class="o">=</span> <span class="n">MyTableProvider</span><span 
class="p">()</span>
+<span class="n">ctx</span><span class="o">.</span><span 
class="n">register_table_provider</span><span class="p">(</span><span 
class="s2">&quot;my_table&quot;</span><span class="p">,</span> <span 
class="n">provider</span><span class="p">)</span>
+
+<span class="n">ctx</span><span class="o">.</span><span 
class="n">table</span><span class="p">(</span><span 
class="s2">&quot;my_table&quot;</span><span class="p">)</span><span 
class="o">.</span><span class="n">show</span><span class="p">()</span>
 </pre></div>
 </div>
 </section>
@@ -388,11 +413,11 @@
               
               <!-- Previous / next buttons -->
 <div class='prev-next-area'>
-    <a class='left-prev' id="prev-link" href="json.html" title="previous page">
+    <a class='left-prev' id="prev-link" href="parquet.html" title="previous 
page">
         <i class="fas fa-angle-left"></i>
         <div class="prev-next-info">
             <p class="prev-next-subtitle">previous</p>
-            <p class="prev-next-title">JSON</p>
+            <p class="prev-next-title">Parquet</p>
         </div>
     </a>
     <a class='right-next' id="next-link" href="../sql.html" title="next page">
diff --git a/user-guide/sql.html b/user-guide/sql.html
index 9420e7d..b1cdc19 100644
--- a/user-guide/sql.html
+++ b/user-guide/sql.html
@@ -35,7 +35,7 @@
     <link rel="index" title="Index" href="../genindex.html" />
     <link rel="search" title="Search" href="../search.html" />
     <link rel="next" title="Introduction" 
href="../contributor-guide/introduction.html" />
-    <link rel="prev" title="Parquet" href="io/parquet.html" />
+    <link rel="prev" title="Custom Table Provider" 
href="io/table_provider.html" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="docsearch:language" content="en">
     
@@ -204,6 +204,11 @@
      Parquet
     </a>
    </li>
+   <li class="toctree-l2">
+    <a class="reference internal" href="io/table_provider.html">
+     Custom Table Provider
+    </a>
+   </li>
   </ul>
  </li>
  <li class="toctree-l1 current active">
@@ -411,11 +416,11 @@
               
               <!-- Previous / next buttons -->
 <div class='prev-next-area'>
-    <a class='left-prev' id="prev-link" href="io/parquet.html" title="previous 
page">
+    <a class='left-prev' id="prev-link" href="io/table_provider.html" 
title="previous page">
         <i class="fas fa-angle-left"></i>
         <div class="prev-next-info">
             <p class="prev-next-subtitle">previous</p>
-            <p class="prev-next-title">Parquet</p>
+            <p class="prev-next-title">Custom Table Provider</p>
         </div>
     </a>
     <a class='right-next' id="next-link" 
href="../contributor-guide/introduction.html" title="next page">


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to