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 7fefccd3 Publish built docs triggered by 
3481904fe9c770ffc218cc043d47d35e860148a6
7fefccd3 is described below

commit 7fefccd33183b5523d2b4c9e5c861066cf0b7ed1
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Feb 18 16:45:49 2026 +0000

    Publish built docs triggered by 3481904fe9c770ffc218cc043d47d35e860148a6
---
 _sources/autoapi/datafusion/index.rst.txt          | 16 ++++++++++
 .../autoapi/datafusion/user_defined/index.rst.txt  | 16 ++++++++++
 .../common-operations/udf-and-udfa.rst.txt         | 33 +++++++++++++++----
 autoapi/datafusion/index.html                      | 14 ++++++++
 autoapi/datafusion/user_defined/index.html         | 14 ++++++++
 searchindex.js                                     |  2 +-
 user-guide/common-operations/aggregations.html     | 30 +++++++++---------
 user-guide/common-operations/basic-info.html       | 34 ++++++++++----------
 user-guide/common-operations/functions.html        | 20 ++++++------
 user-guide/common-operations/udf-and-udfa.html     | 37 ++++++++++++++++++----
 10 files changed, 159 insertions(+), 57 deletions(-)

diff --git a/_sources/autoapi/datafusion/index.rst.txt 
b/_sources/autoapi/datafusion/index.rst.txt
index d967e42e..24fecff4 100644
--- a/_sources/autoapi/datafusion/index.rst.txt
+++ b/_sources/autoapi/datafusion/index.rst.txt
@@ -107,6 +107,14 @@ Package Contents
 
       Return the resultant value.
 
+      While this function template expects a PyArrow Scalar value return type,
+      you can return any value that can be converted into a Scalar. This
+      includes basic Python data types such as integers and strings. In
+      addition to primitive types, we currently support PyArrow, nanoarrow,
+      and arro3 objects in addition to primitive data types. Other objects
+      that support the Arrow FFI standard will be given a "best attempt" at
+      conversion to scalar objects.
+
 
 
    .. py:method:: merge(states: list[pyarrow.Array]) -> None
@@ -123,6 +131,14 @@ Package Contents
 
       Return the current state.
 
+      While this function template expects PyArrow Scalar values return type,
+      you can return any value that can be converted into a Scalar. This
+      includes basic Python data types such as integers and strings. In
+      addition to primitive types, we currently support PyArrow, nanoarrow,
+      and arro3 objects in addition to primitive data types. Other objects
+      that support the Arrow FFI standard will be given a "best attempt" at
+      conversion to scalar objects.
+
 
 
    .. py:method:: update(*values: pyarrow.Array) -> None
diff --git a/_sources/autoapi/datafusion/user_defined/index.rst.txt 
b/_sources/autoapi/datafusion/user_defined/index.rst.txt
index 83f52e66..21063829 100644
--- a/_sources/autoapi/datafusion/user_defined/index.rst.txt
+++ b/_sources/autoapi/datafusion/user_defined/index.rst.txt
@@ -62,6 +62,14 @@ Module Contents
 
       Return the resultant value.
 
+      While this function template expects a PyArrow Scalar value return type,
+      you can return any value that can be converted into a Scalar. This
+      includes basic Python data types such as integers and strings. In
+      addition to primitive types, we currently support PyArrow, nanoarrow,
+      and arro3 objects in addition to primitive data types. Other objects
+      that support the Arrow FFI standard will be given a "best attempt" at
+      conversion to scalar objects.
+
 
 
    .. py:method:: merge(states: list[pyarrow.Array]) -> None
@@ -78,6 +86,14 @@ Module Contents
 
       Return the current state.
 
+      While this function template expects PyArrow Scalar values return type,
+      you can return any value that can be converted into a Scalar. This
+      includes basic Python data types such as integers and strings. In
+      addition to primitive types, we currently support PyArrow, nanoarrow,
+      and arro3 objects in addition to primitive data types. Other objects
+      that support the Arrow FFI standard will be given a "best attempt" at
+      conversion to scalar objects.
+
 
 
    .. py:method:: update(*values: pyarrow.Array) -> None
diff --git a/_sources/user-guide/common-operations/udf-and-udfa.rst.txt 
b/_sources/user-guide/common-operations/udf-and-udfa.rst.txt
index d554e1e2..f669721a 100644
--- a/_sources/user-guide/common-operations/udf-and-udfa.rst.txt
+++ b/_sources/user-guide/common-operations/udf-and-udfa.rst.txt
@@ -123,7 +123,7 @@ also see how the inputs to ``update`` and ``merge`` differ.
 
 .. code-block:: python
 
-    import pyarrow
+    import pyarrow as pa
     import pyarrow.compute
     import datafusion
     from datafusion import col, udaf, Accumulator
@@ -136,16 +136,16 @@ also see how the inputs to ``update`` and ``merge`` 
differ.
         def __init__(self):
             self._sum = 0.0
 
-        def update(self, values_a: pyarrow.Array, values_b: pyarrow.Array) -> 
None:
+        def update(self, values_a: pa.Array, values_b: pa.Array) -> None:
             self._sum = self._sum + pyarrow.compute.sum(values_a).as_py() - 
pyarrow.compute.sum(values_b).as_py()
 
-        def merge(self, states: List[pyarrow.Array]) -> None:
+        def merge(self, states: list[pa.Array]) -> None:
             self._sum = self._sum + pyarrow.compute.sum(states[0]).as_py()
 
-        def state(self) -> pyarrow.Array:
-            return pyarrow.array([self._sum])
+        def state(self) -> list[pa.Scalar]:
+            return [pyarrow.scalar(self._sum)]
 
-        def evaluate(self) -> pyarrow.Scalar:
+        def evaluate(self) -> pa.Scalar:
             return pyarrow.scalar(self._sum)
 
     ctx = datafusion.SessionContext()
@@ -156,10 +156,29 @@ also see how the inputs to ``update`` and ``merge`` 
differ.
         }
     )
 
-    my_udaf = udaf(MyAccumulator, [pyarrow.float64(), pyarrow.float64()], 
pyarrow.float64(), [pyarrow.float64()], 'stable')
+    my_udaf = udaf(MyAccumulator, [pa.float64(), pa.float64()], pa.float64(), 
[pa.float64()], 'stable')
 
     df.aggregate([], [my_udaf(col("a"), col("b")).alias("col_diff")])
 
+FAQ
+^^^
+
+**How do I return a list from a UDAF?**
+
+Both the ``evaluate`` and the ``state`` functions expect to return scalar 
values.
+If you wish to return a list array as a scalar value, the best practice is to
+wrap the values in a ``pyarrow.Scalar`` object. For example, you can return a
+timestamp list with ``pa.scalar([...], type=pa.list_(pa.timestamp("ms")))`` and
+register the appropriate return or state types as
+``return_type=pa.list_(pa.timestamp("ms"))`` and
+``state_type=[pa.list_(pa.timestamp("ms"))]``, respectively.
+
+As of DataFusion 52.0.0 , you can pass return any Python object, including a
+PyArrow array, as the return value(s) for these functions and DataFusion will
+attempt to create a scalar type from the value. DataFusion has been tested to
+convert PyArrow, nanoarrow, and arro3 objects as well as primitive data types
+like integers, strings, and so on.
+
 Window Functions
 ----------------
 
diff --git a/autoapi/datafusion/index.html b/autoapi/datafusion/index.html
index bdc9b610..49b2d73f 100644
--- a/autoapi/datafusion/index.html
+++ b/autoapi/datafusion/index.html
@@ -3572,6 +3572,13 @@ See <a class="reference external" 
href="https://datafusion.apache.org/python";>ht
 <dt class="sig sig-object py" id="datafusion.Accumulator.evaluate">
 <em class="property"><span class="pre">abstract</span><span class="w"> 
</span></em><span class="sig-name descname"><span 
class="pre">evaluate</span></span><span class="sig-paren">(</span><span 
class="sig-paren">)</span> <span class="sig-return"><span 
class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span 
class="pre">pyarrow.Scalar</span></span></span><a class="headerlink" 
href="#datafusion.Accumulator.evaluate" title="Link to this 
definition">¶</a></dt>
 <dd><p>Return the resultant value.</p>
+<p>While this function template expects a PyArrow Scalar value return type,
+you can return any value that can be converted into a Scalar. This
+includes basic Python data types such as integers and strings. In
+addition to primitive types, we currently support PyArrow, nanoarrow,
+and arro3 objects in addition to primitive data types. Other objects
+that support the Arrow FFI standard will be given a “best attempt” at
+conversion to scalar objects.</p>
 </dd></dl>
 
 <dl class="py method">
@@ -3584,6 +3591,13 @@ See <a class="reference external" 
href="https://datafusion.apache.org/python";>ht
 <dt class="sig sig-object py" id="datafusion.Accumulator.state">
 <em class="property"><span class="pre">abstract</span><span class="w"> 
</span></em><span class="sig-name descname"><span 
class="pre">state</span></span><span class="sig-paren">(</span><span 
class="sig-paren">)</span> <span class="sig-return"><span 
class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span 
class="pre">list</span><span class="p"><span class="pre">[</span></span><span 
class="pre">pyarrow.Scalar</span><span class="p"><span 
class="pre">]</span></span></sp [...]
 <dd><p>Return the current state.</p>
+<p>While this function template expects PyArrow Scalar values return type,
+you can return any value that can be converted into a Scalar. This
+includes basic Python data types such as integers and strings. In
+addition to primitive types, we currently support PyArrow, nanoarrow,
+and arro3 objects in addition to primitive data types. Other objects
+that support the Arrow FFI standard will be given a “best attempt” at
+conversion to scalar objects.</p>
 </dd></dl>
 
 <dl class="py method">
diff --git a/autoapi/datafusion/user_defined/index.html 
b/autoapi/datafusion/user_defined/index.html
index 349cc862..4dbf00e9 100644
--- a/autoapi/datafusion/user_defined/index.html
+++ b/autoapi/datafusion/user_defined/index.html
@@ -1134,6 +1134,13 @@
 <dt class="sig sig-object py" 
id="datafusion.user_defined.Accumulator.evaluate">
 <em class="property"><span class="pre">abstract</span><span class="w"> 
</span></em><span class="sig-name descname"><span 
class="pre">evaluate</span></span><span class="sig-paren">(</span><span 
class="sig-paren">)</span> <span class="sig-return"><span 
class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span 
class="pre">pyarrow.Scalar</span></span></span><a class="headerlink" 
href="#datafusion.user_defined.Accumulator.evaluate" title="Link to this 
definition">¶</a></dt>
 <dd><p>Return the resultant value.</p>
+<p>While this function template expects a PyArrow Scalar value return type,
+you can return any value that can be converted into a Scalar. This
+includes basic Python data types such as integers and strings. In
+addition to primitive types, we currently support PyArrow, nanoarrow,
+and arro3 objects in addition to primitive data types. Other objects
+that support the Arrow FFI standard will be given a “best attempt” at
+conversion to scalar objects.</p>
 </dd></dl>
 
 <dl class="py method">
@@ -1146,6 +1153,13 @@
 <dt class="sig sig-object py" id="datafusion.user_defined.Accumulator.state">
 <em class="property"><span class="pre">abstract</span><span class="w"> 
</span></em><span class="sig-name descname"><span 
class="pre">state</span></span><span class="sig-paren">(</span><span 
class="sig-paren">)</span> <span class="sig-return"><span 
class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span 
class="pre">list</span><span class="p"><span class="pre">[</span></span><span 
class="pre">pyarrow.Scalar</span><span class="p"><span 
class="pre">]</span></span></sp [...]
 <dd><p>Return the current state.</p>
+<p>While this function template expects PyArrow Scalar values return type,
+you can return any value that can be converted into a Scalar. This
+includes basic Python data types such as integers and strings. In
+addition to primitive types, we currently support PyArrow, nanoarrow,
+and arro3 objects in addition to primitive data types. Other objects
+that support the Arrow FFI standard will be given a “best attempt” at
+conversion to scalar objects.</p>
 </dd></dl>
 
 <dl class="py method">
diff --git a/searchindex.js b/searchindex.js
index e940047a..c255df34 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"API Reference": [[19, null]], "Additional 
Resources": [[37, "additional-resources"]], "Aggregate Functions": [[24, 
"aggregate-functions"], [31, "aggregate-functions"], [33, 
"aggregate-functions"]], "Aggregation": [[24, null]], "Alternative Approach": 
[[20, "alternative-approach"]], "Apache Iceberg": [[35, "apache-iceberg"]], 
"Arrays": [[26, "arrays"]], "Arrow": [[39, null]], "Attributes": [[4, 
"attributes"], [7, "attributes"], [12, "attributes"], [18, "att [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"API Reference": [[19, null]], "Additional 
Resources": [[37, "additional-resources"]], "Aggregate Functions": [[24, 
"aggregate-functions"], [31, "aggregate-functions"], [33, 
"aggregate-functions"]], "Aggregation": [[24, null]], "Alternative Approach": 
[[20, "alternative-approach"]], "Apache Iceberg": [[35, "apache-iceberg"]], 
"Arrays": [[26, "arrays"]], "Arrow": [[39, null]], "Attributes": [[4, 
"attributes"], [7, "attributes"], [12, "attributes"], [18, "att [...]
\ No newline at end of file
diff --git a/user-guide/common-operations/aggregations.html 
b/user-guide/common-operations/aggregations.html
index d3cc751b..e75ffa32 100644
--- a/user-guide/common-operations/aggregations.html
+++ b/user-guide/common-operations/aggregations.html
@@ -621,15 +621,15 @@ Pokemon set. Since there will be many entries of <code 
class="docutils literal n
 <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">Bug</span>      <span 
class="o">|</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="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="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">Poison</span>   <span 
class="o">|</span> <span class="p">[</span><span class="n">Ground</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">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="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">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">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">Psychic</span><span 
class="p">,</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="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="n">Dark</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="n">Ice</span><span 
class="p">,</span> <span class="n">Fighting</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> <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">Dragon</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">Water</span>    <span 
class="o">|</span> <span class="p">[</span><span class="n">Fighting</span><span 
class="p">,</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">Flying</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">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>
 <span class="n">Data</span> <span class="n">truncated</span><span 
class="o">.</span>
 </pre></div>
@@ -644,14 +644,14 @@ 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">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="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="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">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">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">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">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">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="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="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">Ice</span><span class="p">,</span> <span 
class="n">Poison</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="n">Dark</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">Flying</span><span 
class="p">,</span> <span class="n">Water</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">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>
@@ -663,15 +663,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">Bug</span>      <span 
class="o">|</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="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">Flying</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="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">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">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">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">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">Flying</span><span 
class="p">,</span> <span class="n">Dark</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">Fighting</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">Flying</span><span 
class="p">,</span> <span class="n">Psychic</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">Fighting</span><span class="p">,</span> <span 
class="n">Ice</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>
 <span class="n">Data</span> <span class="n">truncated</span><span 
class="o">.</span>
diff --git a/user-guide/common-operations/basic-info.html 
b/user-guide/common-operations/basic-info.html
index 102c1a0b..abb24229 100644
--- a/user-guide/common-operations/basic-info.html
+++ b/user-guide/common-operations/basic-info.html
@@ -456,11 +456,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">642</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">979</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">425</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">249</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">533</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">850</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">312</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">621</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">792</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">812</span>    <span class="o">|</span> <span class="n">B</span>      
<span class="o">|</span>
 <span class="o">+-----+---------+--------+--------+</span>
 </pre></div>
 </div>
@@ -471,8 +471,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">642</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">979</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">850</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">312</span>    <span class="o">|</span> <span class="n">A</span>      
<span class="o">|</span>
 <span class="o">+-----+--------+--------+--------+</span>
 </pre></div>
 </div>
@@ -490,11 +490,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">642</span>      <span 
class="n">A</span>
-<span class="mi">1</span>    <span class="mi">2</span>     <span 
class="n">ruby</span>     <span class="mi">979</span>      <span 
class="n">A</span>
-<span class="mi">2</span>    <span class="mi">3</span>     <span 
class="n">java</span>     <span class="mi">425</span>      <span 
class="n">B</span>
-<span class="mi">3</span>    <span class="mi">4</span>  <span 
class="n">haskell</span>     <span class="mi">249</span>      <span 
class="n">C</span>
-<span class="mi">4</span>    <span class="mi">5</span>       <span 
class="n">go</span>     <span class="mi">533</span>      <span 
class="n">B</span>
+<span class="mi">0</span>    <span class="mi">1</span>   <span 
class="n">python</span>     <span class="mi">850</span>      <span 
class="n">A</span>
+<span class="mi">1</span>    <span class="mi">2</span>     <span 
class="n">ruby</span>     <span class="mi">312</span>      <span 
class="n">A</span>
+<span class="mi">2</span>    <span class="mi">3</span>     <span 
class="n">java</span>     <span class="mi">621</span>      <span 
class="n">B</span>
+<span class="mi">3</span>    <span class="mi">4</span>  <span 
class="n">haskell</span>     <span class="mi">792</span>      <span 
class="n">C</span>
+<span class="mi">4</span>    <span class="mi">5</span>       <span 
class="n">go</span>     <span class="mi">812</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>
@@ -506,11 +506,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">565.6</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">272.8567389675395</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">249.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">979.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">533.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">677.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">222.3393802276151</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">312.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">850.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">792.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/functions.html 
b/user-guide/common-operations/functions.html
index 7240ad13..38315122 100644
--- a/user-guide/common-operations/functions.html
+++ b/user-guide/common-operations/functions.html
@@ -566,16 +566,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">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
-<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">14</span><span class="n">T00</span><span class="p">:</span><span 
class="mi">19</span><span class="p">:</span><span 
class="mf">23.922353607</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
+<span class="o">|</span> <span class="mi">2026</span><span 
class="o">-</span><span class="mi">02</span><span class="o">-</span><span 
class="mi">18</span><span class="n">T16</span><span class="p">:</span><span 
class="mi">45</span><span class="p">:</span><span 
class="mf">37.900528994</span> <span class="o">|</span>
 <span class="o">+-------------------------------+</span>
 <span class="n">Data</span> <span class="n">truncated</span><span 
class="o">.</span>
 </pre></div>
diff --git a/user-guide/common-operations/udf-and-udfa.html 
b/user-guide/common-operations/udf-and-udfa.html
index 07eb1060..ad7e7010 100644
--- a/user-guide/common-operations/udf-and-udfa.html
+++ b/user-guide/common-operations/udf-and-udfa.html
@@ -426,6 +426,13 @@
   <a class="reference internal nav-link" href="#aggregate-functions">
    Aggregate Functions
   </a>
+  <ul class="visible nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#faq">
+     FAQ
+    </a>
+   </li>
+  </ul>
  </li>
  <li class="toc-h2 nav-item toc-entry">
   <a class="reference internal nav-link" href="#window-functions">
@@ -582,7 +589,7 @@ different states. Finally <code class="docutils literal 
notranslate"><span class
 <p>In the following example we want to define a custom aggregate function that 
will return the
 difference between the sum of two columns. The state can be represented by a 
single value and we can
 also see how the inputs to <code class="docutils literal notranslate"><span 
class="pre">update</span></code> and <code class="docutils literal 
notranslate"><span class="pre">merge</span></code> differ.</p>
-<div class="highlight-python notranslate"><div 
class="highlight"><pre><span></span><span class="kn">import</span><span 
class="w"> </span><span class="nn">pyarrow</span>
+<div class="highlight-python notranslate"><div 
class="highlight"><pre><span></span><span class="kn">import</span><span 
class="w"> </span><span class="nn">pyarrow</span><span class="w"> </span><span 
class="k">as</span><span class="w"> </span><span class="nn">pa</span>
 <span class="kn">import</span><span class="w"> </span><span 
class="nn">pyarrow.compute</span>
 <span class="kn">import</span><span class="w"> </span><span 
class="nn">datafusion</span>
 <span class="kn">from</span><span class="w"> </span><span 
class="nn">datafusion</span><span class="w"> </span><span 
class="kn">import</span> <span class="n">col</span><span class="p">,</span> 
<span class="n">udaf</span><span class="p">,</span> <span 
class="n">Accumulator</span>
@@ -595,16 +602,16 @@ also see how the inputs to <code class="docutils literal 
notranslate"><span clas
     <span class="k">def</span><span class="w"> </span><span 
class="fm">__init__</span><span class="p">(</span><span 
class="bp">self</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span 
class="n">_sum</span> <span class="o">=</span> <span class="mf">0.0</span>
 
-    <span class="k">def</span><span class="w"> </span><span 
class="nf">update</span><span class="p">(</span><span 
class="bp">self</span><span class="p">,</span> <span 
class="n">values_a</span><span class="p">:</span> <span 
class="n">pyarrow</span><span class="o">.</span><span 
class="n">Array</span><span class="p">,</span> <span 
class="n">values_b</span><span class="p">:</span> <span 
class="n">pyarrow</span><span class="o">.</span><span 
class="n">Array</span><span class="p">)</span> <span [...]
+    <span class="k">def</span><span class="w"> </span><span 
class="nf">update</span><span class="p">(</span><span 
class="bp">self</span><span class="p">,</span> <span 
class="n">values_a</span><span class="p">:</span> <span 
class="n">pa</span><span class="o">.</span><span class="n">Array</span><span 
class="p">,</span> <span class="n">values_b</span><span class="p">:</span> 
<span class="n">pa</span><span class="o">.</span><span 
class="n">Array</span><span class="p">)</span> <span class="o" [...]
         <span class="bp">self</span><span class="o">.</span><span 
class="n">_sum</span> <span class="o">=</span> <span 
class="bp">self</span><span class="o">.</span><span class="n">_sum</span> <span 
class="o">+</span> <span class="n">pyarrow</span><span class="o">.</span><span 
class="n">compute</span><span class="o">.</span><span class="n">sum</span><span 
class="p">(</span><span class="n">values_a</span><span class="p">)</span><span 
class="o">.</span><span class="n">as_py</span><span cla [...]
 
-    <span class="k">def</span><span class="w"> </span><span 
class="nf">merge</span><span class="p">(</span><span 
class="bp">self</span><span class="p">,</span> <span 
class="n">states</span><span class="p">:</span> <span 
class="n">List</span><span class="p">[</span><span 
class="n">pyarrow</span><span class="o">.</span><span 
class="n">Array</span><span class="p">])</span> <span class="o">-&gt;</span> 
<span class="kc">None</span><span class="p">:</span>
+    <span class="k">def</span><span class="w"> </span><span 
class="nf">merge</span><span class="p">(</span><span 
class="bp">self</span><span class="p">,</span> <span 
class="n">states</span><span class="p">:</span> <span 
class="nb">list</span><span class="p">[</span><span class="n">pa</span><span 
class="o">.</span><span class="n">Array</span><span class="p">])</span> <span 
class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
         <span class="bp">self</span><span class="o">.</span><span 
class="n">_sum</span> <span class="o">=</span> <span 
class="bp">self</span><span class="o">.</span><span class="n">_sum</span> <span 
class="o">+</span> <span class="n">pyarrow</span><span class="o">.</span><span 
class="n">compute</span><span class="o">.</span><span class="n">sum</span><span 
class="p">(</span><span class="n">states</span><span class="p">[</span><span 
class="mi">0</span><span class="p">])</span><span class=" [...]
 
-    <span class="k">def</span><span class="w"> </span><span 
class="nf">state</span><span class="p">(</span><span 
class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> 
<span class="n">pyarrow</span><span class="o">.</span><span 
class="n">Array</span><span class="p">:</span>
-        <span class="k">return</span> <span class="n">pyarrow</span><span 
class="o">.</span><span class="n">array</span><span class="p">([</span><span 
class="bp">self</span><span class="o">.</span><span class="n">_sum</span><span 
class="p">])</span>
+    <span class="k">def</span><span class="w"> </span><span 
class="nf">state</span><span class="p">(</span><span 
class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> 
<span class="nb">list</span><span class="p">[</span><span 
class="n">pa</span><span class="o">.</span><span class="n">Scalar</span><span 
class="p">]:</span>
+        <span class="k">return</span> <span class="p">[</span><span 
class="n">pyarrow</span><span class="o">.</span><span 
class="n">scalar</span><span class="p">(</span><span 
class="bp">self</span><span class="o">.</span><span class="n">_sum</span><span 
class="p">)]</span>
 
-    <span class="k">def</span><span class="w"> </span><span 
class="nf">evaluate</span><span class="p">(</span><span 
class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> 
<span class="n">pyarrow</span><span class="o">.</span><span 
class="n">Scalar</span><span class="p">:</span>
+    <span class="k">def</span><span class="w"> </span><span 
class="nf">evaluate</span><span class="p">(</span><span 
class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> 
<span class="n">pa</span><span class="o">.</span><span 
class="n">Scalar</span><span class="p">:</span>
         <span class="k">return</span> <span class="n">pyarrow</span><span 
class="o">.</span><span class="n">scalar</span><span class="p">(</span><span 
class="bp">self</span><span class="o">.</span><span class="n">_sum</span><span 
class="p">)</span>
 
 <span class="n">ctx</span> <span class="o">=</span> <span 
class="n">datafusion</span><span class="o">.</span><span 
class="n">SessionContext</span><span class="p">()</span>
@@ -615,11 +622,27 @@ also see how the inputs to <code class="docutils literal 
notranslate"><span clas
     <span class="p">}</span>
 <span class="p">)</span>
 
-<span class="n">my_udaf</span> <span class="o">=</span> <span 
class="n">udaf</span><span class="p">(</span><span 
class="n">MyAccumulator</span><span class="p">,</span> <span 
class="p">[</span><span class="n">pyarrow</span><span class="o">.</span><span 
class="n">float64</span><span class="p">(),</span> <span 
class="n">pyarrow</span><span class="o">.</span><span 
class="n">float64</span><span class="p">()],</span> <span 
class="n">pyarrow</span><span class="o">.</span><span class="n">float64 [...]
+<span class="n">my_udaf</span> <span class="o">=</span> <span 
class="n">udaf</span><span class="p">(</span><span 
class="n">MyAccumulator</span><span class="p">,</span> <span 
class="p">[</span><span class="n">pa</span><span class="o">.</span><span 
class="n">float64</span><span class="p">(),</span> <span 
class="n">pa</span><span class="o">.</span><span class="n">float64</span><span 
class="p">()],</span> <span class="n">pa</span><span class="o">.</span><span 
class="n">float64</span><span cl [...]
 
 <span class="n">df</span><span class="o">.</span><span 
class="n">aggregate</span><span class="p">([],</span> <span 
class="p">[</span><span class="n">my_udaf</span><span class="p">(</span><span 
class="n">col</span><span class="p">(</span><span 
class="s2">&quot;a&quot;</span><span class="p">),</span> <span 
class="n">col</span><span class="p">(</span><span 
class="s2">&quot;b&quot;</span><span class="p">))</span><span 
class="o">.</span><span class="n">alias</span><span class="p">(</span><spa [...]
 </pre></div>
 </div>
+<section id="faq">
+<h3>FAQ<a class="headerlink" href="#faq" title="Link to this 
heading">¶</a></h3>
+<p><strong>How do I return a list from a UDAF?</strong></p>
+<p>Both the <code class="docutils literal notranslate"><span 
class="pre">evaluate</span></code> and the <code class="docutils literal 
notranslate"><span class="pre">state</span></code> functions expect to return 
scalar values.
+If you wish to return a list array as a scalar value, the best practice is to
+wrap the values in a <code class="docutils literal notranslate"><span 
class="pre">pyarrow.Scalar</span></code> object. For example, you can return a
+timestamp list with <code class="docutils literal notranslate"><span 
class="pre">pa.scalar([...],</span> <span 
class="pre">type=pa.list_(pa.timestamp(&quot;ms&quot;)))</span></code> and
+register the appropriate return or state types as
+<code class="docutils literal notranslate"><span 
class="pre">return_type=pa.list_(pa.timestamp(&quot;ms&quot;))</span></code> and
+<code class="docutils literal notranslate"><span 
class="pre">state_type=[pa.list_(pa.timestamp(&quot;ms&quot;))]</span></code>, 
respectively.</p>
+<p>As of DataFusion 52.0.0 , you can pass return any Python object, including a
+PyArrow array, as the return value(s) for these functions and DataFusion will
+attempt to create a scalar type from the value. DataFusion has been tested to
+convert PyArrow, nanoarrow, and arro3 objects as well as primitive data types
+like integers, strings, and so on.</p>
+</section>
 </section>
 <section id="window-functions">
 <h2>Window Functions<a class="headerlink" href="#window-functions" title="Link 
to this heading">¶</a></h2>


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

Reply via email to