mirror of
https://github.com/apache/arrow.git
synced 2026-10-29 09:05:47 +08:00
### Rationale for this change Arrow is currently missing remainder and modulo kernels. ### What changes are included in this PR? Add the kernels `remainder`, `remainder_checked`, `modulo`, and `modulo_checked`, following the terminology in the [divmod proposal](https://lists.apache.org/thread/h3t6nz1ys2k2hnbrjvwyoxkf70cps8sh): * `remainder` uses truncated (C/C++) semantics — the result has the sign of the dividend, e.g. `remainder(-7, 3) == -1`. * `modulo` uses floored (Python/R) semantics — the result has the sign of the divisor, e.g. `modulo(-7, 3) == 2`. Both are supported for integer, floating-point and decimal inputs, and are exposed as `compute::Remainder` / `compute::Modulo` in `api_scalar.h`. Decimal arguments are promoted to a common scale like `add`, but the result type is resolved by a dedicated resolver rather than reusing `ResolveDecimalAdditionOrSubtractionOutput`: a remainder is always smaller in magnitude than the divisor, so no extra digit is needed for a carry, and the result is `precision = max(p1, p2)`, `scale = s1`. This keeps maximum-precision inputs (`decimal128(38, 0)`, `decimal256(76, 0)`) from overflowing the decimal precision range. Left as follow-ups: combined divmod #27909, floor division #39386, and duration support. ### Are these changes tested? Yes. New tests cover truncated vs. floored semantics across signed/unsigned integer, floating-point and decimal types, division by zero, `INT_MIN % -1` overflow, and decimal result-type resolution (same type in/out, mixed precisions and scales, Decimal128/Decimal256 promotion, decimal/integer promotion, and maximum-precision decimals). ### Are there any user-facing changes? Yes — four new compute functions (`remainder`, `remainder_checked`, `modulo`, `modulo_checked`), the corresponding `compute::Remainder` / `compute::Modulo` C++ APIs, and a new `BasicDecimal256 operator%`. These are additions only; no existing API is changed or removed. * GitHub Issue: #46901 * xref: https://github.com/apache/arrow/pull/46902, * xref: https://github.com/apache/arrow/pull/28497 Lead-authored-by: Fangchen Li <fangchen.li@outlook.com> Co-authored-by: Rok Mihevc <54589+rok@users.noreply.github.com> Co-authored-by: tadeja <864005+tadeja@users.noreply.github.com> Signed-off-by: Rok Mihevc <rok@mihevc.org>
2057 lines
147 KiB
ReStructuredText
2057 lines
147 KiB
ReStructuredText
.. 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.
|
|
|
|
.. default-domain:: cpp
|
|
.. highlight:: cpp
|
|
.. cpp:namespace:: arrow::compute
|
|
|
|
.. _compute-cpp:
|
|
|
|
=================
|
|
Compute Functions
|
|
=================
|
|
|
|
The generic Compute API
|
|
=======================
|
|
|
|
.. seealso::
|
|
:doc:`Compute Functions API reference <api/compute>`
|
|
|
|
Functions and function registry
|
|
-------------------------------
|
|
|
|
Functions represent compute operations over inputs of possibly varying
|
|
types. Internally, a function is implemented by one or several
|
|
"kernels", depending on the concrete input types (for example, a function
|
|
adding values from two inputs can have different kernels depending on
|
|
whether the inputs are integral or floating-point).
|
|
|
|
Functions are stored in a global :class:`FunctionRegistry` where
|
|
they can be looked up by name.
|
|
|
|
Compute Initialization
|
|
----------------------
|
|
|
|
The compute library requires a call to :func:`arrow::compute::Initialize`
|
|
in order to register the individual functions into the global :class:`FunctionRegistry`,
|
|
otherwise only the functions required for Arrow core functionality will be available.
|
|
|
|
.. note::
|
|
The set of functions required for Arrow core functionality are an implementation detail
|
|
of the library, and should not be considered stable.
|
|
|
|
Input shapes
|
|
------------
|
|
|
|
Computation inputs are represented as a general :class:`Datum` class,
|
|
which is a tagged union of several shapes of data such as :class:`Scalar`,
|
|
:class:`Array` and :class:`ChunkedArray`. Many compute functions support
|
|
both array (chunked or not) and scalar inputs, however some will mandate
|
|
particular input types. For example, while ``array_sort_indices`` requires its
|
|
first and only input to be an array, the generalized ``sort_indices``
|
|
function accepts an array, chunked array, record batch or table.
|
|
|
|
.. _invoking-compute-functions:
|
|
|
|
Invoking functions
|
|
------------------
|
|
|
|
Compute functions can be invoked by name using
|
|
:func:`arrow::compute::CallFunction`::
|
|
|
|
std::shared_ptr<arrow::Array> numbers_array = ...;
|
|
std::shared_ptr<arrow::Scalar> increment = ...;
|
|
arrow::Datum incremented_datum;
|
|
|
|
ARROW_ASSIGN_OR_RAISE(incremented_datum,
|
|
arrow::compute::CallFunction("add", {numbers_array, increment}));
|
|
std::shared_ptr<Array> incremented_array = std::move(incremented_datum).make_array();
|
|
|
|
(note this example uses implicit conversion from ``std::shared_ptr<Array>``
|
|
to ``Datum``)
|
|
|
|
Many compute functions are also available directly as concrete APIs, here
|
|
:func:`arrow::compute::Add`::
|
|
|
|
std::shared_ptr<arrow::Array> numbers_array = ...;
|
|
std::shared_ptr<arrow::Scalar> increment = ...;
|
|
arrow::Datum incremented_datum;
|
|
|
|
ARROW_ASSIGN_OR_RAISE(incremented_datum,
|
|
arrow::compute::Add(numbers_array, increment));
|
|
std::shared_ptr<Array> incremented_array = std::move(incremented_datum).make_array();
|
|
|
|
Some functions accept or require an options structure that determines the
|
|
exact semantics of the function::
|
|
|
|
ScalarAggregateOptions scalar_aggregate_options;
|
|
scalar_aggregate_options.skip_nulls = false;
|
|
|
|
std::shared_ptr<arrow::Array> array = ...;
|
|
arrow::Datum min_max;
|
|
|
|
ARROW_ASSIGN_OR_RAISE(min_max,
|
|
arrow::compute::CallFunction("min_max", {array},
|
|
&scalar_aggregate_options));
|
|
|
|
// Unpack struct scalar result (a two-field {"min", "max"} scalar)
|
|
std::shared_ptr<arrow::Scalar> min_value, max_value;
|
|
min_value = min_max.scalar_as<arrow::StructScalar>().value[0];
|
|
max_value = min_max.scalar_as<arrow::StructScalar>().value[1];
|
|
|
|
However, :ref:`Grouped Aggregations <grouped-aggregations-group-by>` are
|
|
not invocable via ``CallFunction``.
|
|
|
|
.. seealso::
|
|
:doc:`Compute API reference <api/compute>`
|
|
|
|
Implicit casts
|
|
==============
|
|
|
|
Functions may require conversion of their arguments before execution if a
|
|
kernel does not match the argument types precisely. For example comparison
|
|
of dictionary encoded arrays is not directly supported by any kernel, but an
|
|
implicit cast can be made allowing comparison against the decoded array.
|
|
|
|
Each function may define implicit cast behaviour as appropriate. For example
|
|
comparison and arithmetic kernels require identically typed arguments, and
|
|
support execution against differing numeric types by promoting their arguments
|
|
to numeric type which can accommodate any value from either input.
|
|
|
|
.. _common-numeric-type:
|
|
|
|
Common numeric type
|
|
-------------------
|
|
|
|
The common numeric type of a set of input numeric types is the smallest numeric
|
|
type which can accommodate any value of any input. If any input is a floating
|
|
point type the common numeric type is the widest floating point type among the
|
|
inputs. Otherwise the common numeric type is integral and is signed if any input
|
|
is signed. For example:
|
|
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| Input types | Common numeric type | Notes |
|
|
+===================+======================+================================================+
|
|
| int32, int32 | int32 | |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| int16, int32 | int32 | Max width is 32, promote LHS to int32 |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| uint16, int32 | int32 | One input signed, override unsigned |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| uint32, int32 | int64 | Widen to accommodate range of uint32 |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| uint16, uint32 | uint32 | All inputs unsigned, maintain unsigned |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| int16, uint32 | int64 | |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| uint64, int16 | int64 | int64 cannot accommodate all uint64 values |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| float32, int32 | float32 | Promote RHS to float32 |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| float32, float64 | float64 | |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
| float32, int64 | float32 | int64 is wider, still promotes to float32 |
|
|
+-------------------+----------------------+------------------------------------------------+
|
|
|
|
In particular, note that comparing a ``uint64`` column to an ``int16`` column
|
|
may emit an error if one of the ``uint64`` values cannot be expressed as the
|
|
common type ``int64`` (for example, ``2 ** 63``).
|
|
|
|
.. _compute-function-list:
|
|
|
|
Available functions
|
|
===================
|
|
|
|
Type categories
|
|
---------------
|
|
|
|
To avoid exhaustively listing supported types, the tables below use a number
|
|
of general type categories:
|
|
|
|
* "Numeric": Integer types (Int8, etc.) and Floating-point types (Float32,
|
|
Float64, sometimes Float16). Some functions also accept Decimal input.
|
|
|
|
* "Temporal": Date types (Date32, Date64), Time types (Time32, Time64),
|
|
Timestamp, Duration, Interval.
|
|
|
|
* "Binary-like": Binary, LargeBinary, sometimes also FixedSizeBinary.
|
|
|
|
* "String-like": String, LargeString.
|
|
|
|
* "List-like": List, LargeList, ListView, LargeListView, and sometimes also
|
|
FixedSizeList.
|
|
|
|
* "Nested": List-likes (including FixedSizeList), Struct, Union, and
|
|
related types like Map.
|
|
|
|
If you are unsure whether a function supports a concrete input type, we
|
|
recommend you try it out. Unsupported input types return a ``TypeError``
|
|
:class:`Status`.
|
|
|
|
.. _aggregation-option-list:
|
|
|
|
Aggregations
|
|
------------
|
|
|
|
Scalar aggregations operate on a (chunked) array or scalar value and reduce
|
|
the input to a single output value.
|
|
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+====================+=========+===============================================+========================+==================================+============+
|
|
| all | Unary | Boolean | Scalar Boolean | :struct:`ScalarAggregateOptions` | \(1) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| any | Unary | Boolean | Scalar Boolean | :struct:`ScalarAggregateOptions` | \(1) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| approximate_median | Unary | Numeric | Scalar Float64 | :struct:`ScalarAggregateOptions` | |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| count | Unary | Any | Scalar Int64 | :struct:`CountOptions` | \(2) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| count_all | Nullary | | Scalar Int64 | | |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| count_distinct | Unary | Non-nested types | Scalar Int64 | :struct:`CountOptions` | \(2) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| first | Unary | Numeric, Binary | Scalar Input type | :struct:`ScalarAggregateOptions` | \(3) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| first_last | Unary | Numeric, Binary | Scalar Struct | :struct:`ScalarAggregateOptions` | \(3) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| index | Unary | Any | Scalar Int64 | :struct:`IndexOptions` | \(4) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| kurtosis | Unary | Numeric | Scalar Float64 | :struct:`SkewOptions` | \(12) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| last | Unary | Numeric, Binary | Scalar Input type | :struct:`ScalarAggregateOptions` | \(3) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| max | Unary | Non-nested types | Scalar Input type | :struct:`ScalarAggregateOptions` | |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| mean | Unary | Numeric | Scalar Decimal/Float64 | :struct:`ScalarAggregateOptions` | \(5) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| min | Unary | Non-nested types | Scalar Input type | :struct:`ScalarAggregateOptions` | |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| min_max | Unary | Non-nested types | Scalar Struct | :struct:`ScalarAggregateOptions` | \(6) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| mode | Unary | Numeric | Struct | :struct:`ModeOptions` | \(7) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| pivot_wider | Binary | Binary, String, Integer (Arg 0); Any (Arg 1) | Scalar Struct | :struct:`PivotWiderOptions` | \(8) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| product | Unary | Numeric | Scalar Numeric | :struct:`ScalarAggregateOptions` | \(9) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| quantile | Unary | Numeric | Scalar Numeric | :struct:`QuantileOptions` | \(11) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| skew | Unary | Numeric | Scalar Float64 | :struct:`SkewOptions` | \(12) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| stddev | Unary | Numeric | Scalar Float64 | :struct:`VarianceOptions` | \(12) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| sum | Unary | Numeric | Scalar Numeric | :struct:`ScalarAggregateOptions` | \(9) \(10) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| tdigest | Unary | Numeric | Float64 | :struct:`TDigestOptions` | \(13) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
| variance | Unary | Numeric | Scalar Float64 | :struct:`VarianceOptions` | \(12) |
|
|
+--------------------+---------+-----------------------------------------------+------------------------+----------------------------------+------------+
|
|
|
|
* \(1) If null values are taken into account, by setting the
|
|
ScalarAggregateOptions parameter skip_nulls = false, then `Kleene logic`_
|
|
logic is applied. The min_count option is not respected.
|
|
|
|
* \(2) CountMode controls whether only non-null values are counted (the
|
|
default), only null values are counted, or all values are counted.
|
|
|
|
* \(3) Result is based on the ordering of input data.
|
|
|
|
* \(4) Returns -1 if the value is not found. The index of a null value
|
|
is always -1, regardless of whether there are nulls in the input.
|
|
|
|
* \(5) For decimal inputs, the resulting decimal will have the same
|
|
precision and scale. The result is rounded away from zero.
|
|
|
|
* \(6) Output is a ``{"min": input type, "max": input type}`` Struct.
|
|
|
|
Of the interval types, only the month interval is supported, as the day-time
|
|
and month-day-nano types are not sortable.
|
|
|
|
* \(7) Output is an array of ``{"mode": input type, "count": Int64}`` Struct.
|
|
It contains the *N* most common elements in the input, in descending
|
|
order, where *N* is given in :member:`ModeOptions::n`.
|
|
If two values have the same count, the smallest one comes first.
|
|
Note that the output can have less than *N* elements if the input has
|
|
less than *N* distinct values.
|
|
|
|
* \(8) The first input contains the pivot key, while the second input contains
|
|
the values to be pivoted. The output is a Struct with one field for each key
|
|
in :member:`PivotOptions::key_names`.
|
|
|
|
* \(9) Output is Int64, UInt64, Float64, or Decimal128/256, depending on the
|
|
input type.
|
|
|
|
* \(10) For Decimal input, the output precision is increased to the maximum
|
|
precision for the input type's width. For instance, an array of
|
|
``decimal128(3, 2)`` will return a ``decimal128(38, 2)`` scalar.
|
|
|
|
* \(11) Output is Float64 or input type, depending on QuantileOptions.
|
|
|
|
* \(12) Decimal arguments are cast to Float64 first.
|
|
|
|
* \(13) tdigest/t-digest computes approximate quantiles, and so only needs a
|
|
fixed amount of memory. See the `reference implementation
|
|
<https://github.com/tdunning/t-digest>`_ for details.
|
|
|
|
Decimal arguments are cast to Float64 first.
|
|
|
|
.. _grouped-aggregations-group-by:
|
|
|
|
Grouped Aggregations ("group by")
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Grouped aggregations are not directly invocable, but are used as part of a
|
|
SQL-style "group by" operation. Like scalar aggregations, grouped aggregations
|
|
reduce multiple input values to a single output value. Instead of aggregating
|
|
all values of the input, however, grouped aggregations partition the input
|
|
values on some set of "key" columns, then aggregate each group individually,
|
|
emitting one output value per input group.
|
|
|
|
As an example, for the following table:
|
|
|
|
+------------------+-----------------+
|
|
| Column ``key`` | Column ``x`` |
|
|
+==================+=================+
|
|
| "a" | 2 |
|
|
+------------------+-----------------+
|
|
| "a" | 5 |
|
|
+------------------+-----------------+
|
|
| "b" | null |
|
|
+------------------+-----------------+
|
|
| "b" | null |
|
|
+------------------+-----------------+
|
|
| null | null |
|
|
+------------------+-----------------+
|
|
| null | 9 |
|
|
+------------------+-----------------+
|
|
|
|
we can compute a sum of the column ``x``, grouped on the column ``key``.
|
|
This gives us three groups, with the following results. Note that null is
|
|
treated as a distinct key value.
|
|
|
|
+------------------+-----------------------+
|
|
| Column ``key`` | Column ``sum(x)`` |
|
|
+==================+=======================+
|
|
| "a" | 7 |
|
|
+------------------+-----------------------+
|
|
| "b" | null |
|
|
+------------------+-----------------------+
|
|
| null | 9 |
|
|
+------------------+-----------------------+
|
|
|
|
The supported aggregation functions are as follows. All function names are
|
|
prefixed with ``hash_``, which differentiates them from their scalar
|
|
equivalents above and reflects how they are implemented internally.
|
|
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=========================+=========+==============================================+========================+==================================+===========+
|
|
| hash_all | Unary | Boolean | Boolean | :struct:`ScalarAggregateOptions` | \(1) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_any | Unary | Boolean | Boolean | :struct:`ScalarAggregateOptions` | \(1) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_approximate_median | Unary | Numeric | Float64 | :struct:`ScalarAggregateOptions` | |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_count | Unary | Any | Int64 | :struct:`CountOptions` | \(2) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_count_all | Nullary | | Int64 | | |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_count_distinct | Unary | Any | Int64 | :struct:`CountOptions` | \(2) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_distinct | Unary | Any | List of input type | :struct:`CountOptions` | \(2) \(3) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_first | Unary | Numeric, Binary | Input type | :struct:`ScalarAggregateOptions` | \(11) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_first_last | Unary | Numeric, Binary | Struct | :struct:`ScalarAggregateOptions` | \(11) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_kurtosis | Unary | Numeric | Float64 | :struct:`SkewOptions` | \(9) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_last | Unary | Numeric, Binary | Input type | :struct:`ScalarAggregateOptions` | \(11) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_list | Unary | Any | List of input type | | \(3) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_max | Unary | Non-nested, non-binary/string-like | Input type | :struct:`ScalarAggregateOptions` | |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_mean | Unary | Numeric | Decimal/Float64 | :struct:`ScalarAggregateOptions` | \(4) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_min | Unary | Non-nested, non-binary/string-like | Input type | :struct:`ScalarAggregateOptions` | |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_min_max | Unary | Non-nested types | Struct | :struct:`ScalarAggregateOptions` | \(5) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_one | Unary | Any | Input type | | \(6) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_pivot_wider | Binary | Binary, String, Integer (Arg 0); Any (Arg 1) | Struct | :struct:`PivotWiderOptions` | \(7) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_product | Unary | Numeric | Numeric | :struct:`ScalarAggregateOptions` | \(8) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_skew | Unary | Numeric | Float64 | :struct:`SkewOptions` | \(9) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_stddev | Unary | Numeric | Float64 | :struct:`VarianceOptions` | \(9) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_sum | Unary | Numeric | Numeric | :struct:`ScalarAggregateOptions` | \(8) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_tdigest | Unary | Numeric | FixedSizeList[Float64] | :struct:`TDigestOptions` | \(10) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
| hash_variance | Unary | Numeric | Float64 | :struct:`VarianceOptions` | \(9) |
|
|
+-------------------------+---------+----------------------------------------------+------------------------+----------------------------------+-----------+
|
|
|
|
* \(1) If null values are taken into account, by setting the
|
|
:member:`ScalarAggregateOptions::skip_nulls` to false, then `Kleene logic`_
|
|
logic is applied. The min_count option is not respected.
|
|
|
|
* \(2) CountMode controls whether only non-null values are counted
|
|
(the default), only null values are counted, or all values are
|
|
counted. For hash_distinct, it instead controls whether null values
|
|
are emitted. This never affects the grouping keys, only group values
|
|
(i.e. you may get a group where the key is null).
|
|
|
|
* \(3) ``hash_distinct`` and ``hash_list`` gather the grouped values
|
|
into a list array.
|
|
|
|
* \(4) For decimal inputs, the resulting decimal will have the same
|
|
precision and scale. The result is rounded away from zero.
|
|
|
|
* \(5) Output is a ``{"min": input type, "max": input type}`` Struct array.
|
|
|
|
Of the interval types, only the month interval is supported, as the day-time
|
|
and month-day-nano types are not sortable.
|
|
|
|
* \(6) ``hash_one`` returns one arbitrary value from the input for each
|
|
group. The function is biased towards non-null values: if there is at least
|
|
one non-null value for a certain group, that value is returned, and only if
|
|
all the values are ``null`` for the group will the function return ``null``.
|
|
|
|
* \(7) The first input contains the pivot key, while the second input contains
|
|
the values to be pivoted. The output is a Struct with one field for each key
|
|
in :member:`PivotOptions::key_names`.
|
|
|
|
* \(8) Output is Int64, UInt64, Float64, or Decimal128/256, depending on the
|
|
input type.
|
|
|
|
* \(9) Decimal arguments are cast to Float64 first.
|
|
|
|
* \(10) T-digest computes approximate quantiles, and so only needs a
|
|
fixed amount of memory. See the `reference implementation
|
|
<https://github.com/tdunning/t-digest>`_ for details.
|
|
|
|
* \(11) Result is based on ordering of the input data.
|
|
|
|
|
|
Element-wise ("scalar") functions
|
|
---------------------------------
|
|
|
|
All element-wise functions accept both arrays and scalars as input. The
|
|
semantics for unary functions are as follow:
|
|
|
|
* scalar inputs produce a scalar output
|
|
* array inputs produce an array output
|
|
|
|
Binary functions have the following semantics (which is sometimes called
|
|
"broadcasting" in other systems such as NumPy):
|
|
|
|
* ``(scalar, scalar)`` inputs produce a scalar output
|
|
* ``(array, array)`` inputs produce an array output (and both inputs must
|
|
be of the same length)
|
|
* ``(scalar, array)`` and ``(array, scalar)`` produce an array output.
|
|
The scalar input is handled as if it were an array of the same length N
|
|
as the other input, with the same value repeated N times.
|
|
|
|
Arithmetic functions
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
These functions expect inputs of numeric type and apply a given arithmetic
|
|
operation to each element(s) gathered from the input(s). If any of the
|
|
input element(s) is null, the corresponding output element is null.
|
|
For binary functions, input(s) will be cast to the
|
|
:ref:`common numeric type <common-numeric-type>`
|
|
(and dictionary decoded, if applicable) before the operation is applied.
|
|
|
|
The default variant of these functions does not detect overflow (the result
|
|
then typically wraps around). Most functions are also available in an
|
|
overflow-checking variant, suffixed ``_checked``, which returns
|
|
an ``Invalid`` :class:`Status` when overflow is detected.
|
|
|
|
For functions which support decimal inputs (currently ``add``, ``subtract``,
|
|
``multiply``, ``divide``, ``modulo``, and ``remainder`` and their checked
|
|
variants), decimals of different precisions/scales will be promoted
|
|
appropriately. Mixed decimal and floating-point arguments will cast all
|
|
arguments to floating-point, while mixed decimal and integer arguments will
|
|
cast all arguments to decimals.
|
|
Mixed time resolution temporal inputs will be cast to finest input resolution.
|
|
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Notes |
|
|
+===================+========+=========================+===============================+=======+
|
|
| abs | Unary | Numeric/Duration | Numeric/Duration | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| abs_checked | Unary | Numeric/Duration | Numeric/Duration | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| add | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| add_checked | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| divide | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| divide_checked | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| exp | Unary | Numeric | Float32/Float64 | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| expm1 | Unary | Numeric | Float32/Float64 | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| hypot | Binary | Numeric | Float32/Float64 | \(3) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| modulo | Binary | Numeric | Numeric | \(4) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| modulo_checked | Binary | Numeric | Numeric | \(4) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| multiply | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| multiply_checked | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| negate | Unary | Numeric/Duration | Numeric/Duration | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| negate_checked | Unary | Signed Numeric/Duration | Signed Numeric/Duration | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| power | Binary | Numeric | Numeric | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| power_checked | Binary | Numeric | Numeric | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| remainder | Binary | Numeric | Numeric | \(5) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| remainder_checked | Binary | Numeric | Numeric | \(5) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| sign | Unary | Numeric/Duration | Int8/Float16/Float32/Float64 | \(2) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| sqrt | Unary | Numeric | Numeric | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| sqrt_checked | Unary | Numeric | Numeric | |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| subtract | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
| subtract_checked | Binary | Numeric/Temporal | Numeric/Temporal | \(1) |
|
|
+-------------------+--------+-------------------------+-------------------------------+-------+
|
|
|
|
* \(1) Precision and scale of computed DECIMAL results
|
|
|
|
+------------+---------------------------------------------+
|
|
| Operation | Result precision and scale |
|
|
+============+=============================================+
|
|
| | add | | scale = max(s1, s2) |
|
|
| | subtract | | precision = max(p1-s1, p2-s2) + 1 + scale |
|
|
+------------+---------------------------------------------+
|
|
| multiply | | scale = s1 + s2 |
|
|
| | | precision = p1 + p2 + 1 |
|
|
+------------+---------------------------------------------+
|
|
| divide | | scale = max(4, s1 + p2 - s2 + 1) |
|
|
| | | precision = p1 - s1 + s2 + scale |
|
|
+------------+---------------------------------------------+
|
|
|
|
It's compatible with Redshift's decimal promotion rules. All decimal digits
|
|
are preserved for ``add``, ``subtract`` and ``multiply`` operations. The result
|
|
precision of ``divide`` is at least the sum of precisions of both operands with
|
|
enough scale kept. Error is returned if the result precision is beyond the
|
|
decimal value range.
|
|
|
|
* \(2) Output is any of (-1,1) for nonzero inputs and 0 for zero input. NaN
|
|
values return NaN. Integral and decimal values return signedness as Int8 and
|
|
floating-point values return it with the same type as the input values.
|
|
|
|
* \(3) Computes ``sqrt(x^2 + y^2)`` without undue overflow or underflow at
|
|
intermediate stages of the computation. If either argument is infinite, the
|
|
result is ``+Inf`` even if the other argument is NaN.
|
|
|
|
* \(4) Computes the floored modulo, where the result has the same sign as the
|
|
divisor. This is equivalent to Python's ``%`` operator. Division by zero
|
|
returns an error for integer and decimal inputs. For floating-point inputs
|
|
it returns ``NaN`` in ``modulo`` and an error in ``modulo_checked``. Decimal
|
|
arguments are promoted to a common scale ``s``; the result then has
|
|
``scale = s`` and ``precision = max(p1, p2)``.
|
|
|
|
* \(5) Computes the truncated remainder, where the result has the same sign as
|
|
the dividend. This is equivalent to C/C++'s ``%`` operator. Division by
|
|
zero returns an error for integer and decimal inputs. For floating-point
|
|
inputs it returns ``NaN`` in ``remainder`` and an error in
|
|
``remainder_checked``. Decimal arguments are promoted to a common scale
|
|
``s``; the result then has ``scale = s`` and ``precision = max(p1, p2)``.
|
|
|
|
Bit-wise functions
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| Function name | Arity | Input types | Output type |
|
|
+==========================+============+====================+=====================+
|
|
| bit_wise_and | Binary | Numeric | Numeric |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| bit_wise_not | Unary | Numeric | Numeric |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| bit_wise_or | Binary | Numeric | Numeric |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| bit_wise_xor | Binary | Numeric | Numeric |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| shift_left | Binary | Numeric | Numeric |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| shift_left_checked | Binary | Numeric | Numeric (1) |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| shift_right | Binary | Numeric | Numeric |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| shift_right_checked | Binary | Numeric | Numeric (1) |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
|
|
* \(1) An error is emitted if the shift amount (i.e. the second input) is
|
|
out of bounds for the data type. However, an overflow when shifting the
|
|
first input is not error (truncated bits are silently discarded).
|
|
|
|
Rounding functions
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
Rounding functions displace numeric inputs to an approximate value with a simpler
|
|
representation based on the rounding criterion.
|
|
|
|
+-------------------+------------+-------------+-------------------------+----------------------------------+--------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+===================+============+=============+=========================+==================================+========+
|
|
| ceil | Unary | Numeric | Float32/Float64/Decimal | | |
|
|
+-------------------+------------+-------------+-------------------------+----------------------------------+--------+
|
|
| floor | Unary | Numeric | Float32/Float64/Decimal | | |
|
|
+-------------------+------------+-------------+-------------------------+----------------------------------+--------+
|
|
| round | Unary | Numeric | Input Type | :struct:`RoundOptions` | (1)(2) |
|
|
+-------------------+------------+-------------+-------------------------+----------------------------------+--------+
|
|
| round_to_multiple | Unary | Numeric | Input Type | :struct:`RoundToMultipleOptions` | (1)(3) |
|
|
+-------------------+------------+-------------+-------------------------+----------------------------------+--------+
|
|
| round_binary | Binary | Numeric | Input Type | :struct:`RoundBinaryOptions` | (1)(4) |
|
|
+-------------------+------------+-------------+-------------------------+----------------------------------+--------+
|
|
| trunc | Unary | Numeric | Float32/Float64/Decimal | | |
|
|
+-------------------+------------+-------------+-------------------------+----------------------------------+--------+
|
|
|
|
* \(1) By default rounding functions change a value to the nearest
|
|
integer using HALF_TO_EVEN to resolve ties. Options are available to control
|
|
the rounding criterion. All ``round`` functions have the
|
|
``round_mode`` option to set the rounding mode.
|
|
* \(2) Round to a number of digits where the ``ndigits`` option of
|
|
:struct:`RoundOptions` specifies the rounding precision in terms of number
|
|
of digits. A negative value corresponds to digits in the non-fractional
|
|
part. For example, -2 corresponds to rounding to the nearest multiple of
|
|
100 (zeroing the ones and tens digits). Default value of ``ndigits`` is 0
|
|
which rounds to the nearest integer. For integer inputs a non-negative
|
|
``ndigits`` value is ignored and the input is returned unchanged. For integer
|
|
inputs, if ``-ndigits`` is larger than the maximum number of digits the
|
|
input type can hold, an error is returned.
|
|
* \(3) Round to a multiple where the ``multiple`` option of
|
|
:struct:`RoundToMultipleOptions` specifies the rounding scale. The rounding
|
|
multiple has to be a positive value and can be casted to input type.
|
|
For example, 100 corresponds to rounding to the nearest multiple of 100
|
|
(zeroing the ones and tens digits). Default value of ``multiple`` is 1 which
|
|
rounds to the nearest integer.
|
|
* \(4) Round the first input to multiple of the second input. The rounding
|
|
multiple has to be a positive value and can be casted to the first input type.
|
|
For example, 100 corresponds to rounding to the nearest multiple of 100
|
|
(zeroing the ones and tens digits).
|
|
|
|
For ``round`` functions, the following rounding modes are available.
|
|
Tie-breaking modes are prefixed with HALF and round non-ties to the nearest integer.
|
|
The example values are given for default values of ``ndigits`` and ``multiple``.
|
|
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| ``round_mode`` | Operation performed | Example values |
|
|
+=======================+==============================================================+===========================+
|
|
| DOWN | Round to nearest integer less than or equal in magnitude; | 3.2 -> 3, 3.7 -> 3, |
|
|
| | also known as ``floor(x)`` | -3.2 -> -4, -3.7 -> -4 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| UP | Round to nearest integer greater than or equal in magnitude; | 3.2 -> 4, 3.7 -> 4, |
|
|
| | also known as ``ceil(x)`` | -3.2 -> -3, -3.7 -> -3 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| TOWARDS_ZERO | Get the integral part without fractional digits; | 3.2 -> 3, 3.7 -> 3, |
|
|
| | also known as ``trunc(x)`` | -3.2 -> -3, -3.7 -> -3 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| TOWARDS_INFINITY | Round negative values with ``DOWN`` rule, | 3.2 -> 4, 3.7 -> 4, |
|
|
| | round positive values with ``UP`` rule | -3.2 -> -4, -3.7 -> -4 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| HALF_DOWN | Round ties with ``DOWN`` rule | 3.5 -> 3, 4.5 -> 4, |
|
|
| | | -3.5 -> -4, -4.5 -> -5 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| HALF_UP | Round ties with ``UP`` rule | 3.5 -> 4, 4.5 -> 5, |
|
|
| | | -3.5 -> -3, -4.5 -> -4 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| HALF_TOWARDS_ZERO | Round ties with ``TOWARDS_ZERO`` rule | 3.5 -> 3, 4.5 -> 4, |
|
|
| | | -3.5 -> -3, -4.5 -> -4 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| HALF_TOWARDS_INFINITY | Round ties with ``TOWARDS_INFINITY`` rule | 3.5 -> 4, 4.5 -> 5, |
|
|
| | | -3.5 -> -4, -4.5 -> -5 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| HALF_TO_EVEN | Round ties to nearest even integer | 3.5 -> 4, 4.5 -> 4, |
|
|
| | | -3.5 -> -4, -4.5 -> -4 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
| HALF_TO_ODD | Round ties to nearest odd integer | 3.5 -> 3, 4.5 -> 5, |
|
|
| | | -3.5 -> -3, -4.5 -> -5 |
|
|
+-----------------------+--------------------------------------------------------------+---------------------------+
|
|
|
|
The following table gives examples of how ``ndigits`` (for the ``round``
|
|
and ``round_binary`` functions) and ``multiple`` (for ``round_to_multiple``)
|
|
influence the operation performed, respectively.
|
|
|
|
+--------------------+-------------------+---------------------------+
|
|
| Round ``multiple`` | Round ``ndigits`` | Operation performed |
|
|
+====================+===================+===========================+
|
|
| 1 | 0 | Round to integer |
|
|
+--------------------+-------------------+---------------------------+
|
|
| 0.001 | 3 | Round to 3 decimal places |
|
|
+--------------------+-------------------+---------------------------+
|
|
| 10 | -1 | Round to multiple of 10 |
|
|
+--------------------+-------------------+---------------------------+
|
|
| 2 | NA | Round to multiple of 2 |
|
|
+--------------------+-------------------+---------------------------+
|
|
|
|
Logarithmic functions
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Logarithmic functions are also supported, and also offer ``_checked``
|
|
variants that check for domain errors if needed.
|
|
|
|
Decimal values are accepted, but are cast to Float64 first.
|
|
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| Function name | Arity | Input types | Output type |
|
|
+==========================+============+=========================+=====================+
|
|
| ln | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| ln_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| log10 | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| log10_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| log1p | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| log1p_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| log2 | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| log2_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| logb | Binary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| logb_checked | Binary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
|
|
Trigonometric functions
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Trigonometric functions are also supported, and also offer ``_checked``
|
|
variants that check for domain errors if needed.
|
|
|
|
Decimal values are accepted, but are cast to Float64 first.
|
|
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| Function name | Arity | Input types | Output type |
|
|
+==========================+============+=========================+=====================+
|
|
| acos | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| acos_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| asin | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| asin_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| atan | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| atan2 | Binary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| cos | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| cos_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| sin | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| sin_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| tan | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| tan_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
|
|
Hyperbolic trigonometric functions
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Hyperbolic trigonometric functions are also supported, and, where applicable, also offer
|
|
``_checked`` variants that check for domain errors if needed.
|
|
|
|
Decimal values are accepted, but are cast to Float64 first.
|
|
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| Function name | Arity | Input types | Output type |
|
|
+==========================+============+=========================+=====================+
|
|
| acosh | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| acosh_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| asinh | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| atanh | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| atanh_checked | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| cosh | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| sinh | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
| tanh | Unary | Float32/Float64/Decimal | Float32/Float64 |
|
|
+--------------------------+------------+-------------------------+---------------------+
|
|
|
|
|
|
Comparisons
|
|
~~~~~~~~~~~
|
|
|
|
These functions expect two inputs of numeric type (in which case they will be
|
|
cast to the :ref:`common numeric type <common-numeric-type>` before comparison),
|
|
or two inputs of Binary- or String-like types, or two inputs of Temporal types.
|
|
If any input is dictionary encoded it will be expanded for the purposes of
|
|
comparison. If any of the input elements in a pair is null, the corresponding
|
|
output element is null. Decimal arguments will be promoted in the same way as
|
|
for ``add`` and ``subtract``.
|
|
|
|
+----------------+------------+---------------------------------------------+---------------------+
|
|
| Function names | Arity | Input types | Output type |
|
|
+================+============+=============================================+=====================+
|
|
| equal | Binary | Numeric, Temporal, Binary- and String-like | Boolean |
|
|
+----------------+------------+---------------------------------------------+---------------------+
|
|
| greater | Binary | Numeric, Temporal, Binary- and String-like | Boolean |
|
|
+----------------+------------+---------------------------------------------+---------------------+
|
|
| greater_equal | Binary | Numeric, Temporal, Binary- and String-like | Boolean |
|
|
+----------------+------------+---------------------------------------------+---------------------+
|
|
| less | Binary | Numeric, Temporal, Binary- and String-like | Boolean |
|
|
+----------------+------------+---------------------------------------------+---------------------+
|
|
| less_equal | Binary | Numeric, Temporal, Binary- and String-like | Boolean |
|
|
+----------------+------------+---------------------------------------------+---------------------+
|
|
| not_equal | Binary | Numeric, Temporal, Binary- and String-like | Boolean |
|
|
+----------------+------------+---------------------------------------------+---------------------+
|
|
|
|
These functions take any number of inputs of numeric type (in which case they
|
|
will be cast to the :ref:`common numeric type <common-numeric-type>` before
|
|
comparison) or of temporal types. If any input is dictionary encoded it will be
|
|
expanded for the purposes of comparison.
|
|
|
|
+------------------+------------+---------------------------------------------+---------------------+---------------------------------------+-------+
|
|
| Function names | Arity | Input types | Output type | Options class | Notes |
|
|
+==================+============+=============================================+=====================+=======================================+=======+
|
|
| max_element_wise | Varargs | Numeric, Temporal, Binary- and String-like | Numeric or Temporal | :struct:`ElementWiseAggregateOptions` | \(1) |
|
|
+------------------+------------+---------------------------------------------+---------------------+---------------------------------------+-------+
|
|
| min_element_wise | Varargs | Numeric, Temporal, Binary- and String-like | Numeric or Temporal | :struct:`ElementWiseAggregateOptions` | \(1) |
|
|
+------------------+------------+---------------------------------------------+---------------------+---------------------------------------+-------+
|
|
|
|
* \(1) By default, nulls are skipped (but the kernel can be configured to propagate nulls).
|
|
For floating point values, NaN will be taken over null but not over any other value.
|
|
For binary- and string-like values, only identical type parameters are supported.
|
|
|
|
Logical functions
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
The normal behaviour for these functions is to emit a null if any of the
|
|
inputs is null (similar to the semantics of ``NaN`` in floating-point
|
|
computations).
|
|
|
|
Some of them are also available in a `Kleene logic`_ variant (suffixed
|
|
``_kleene``) where null is taken to mean "undefined". This is the
|
|
interpretation of null used in SQL systems as well as R and Julia,
|
|
for example.
|
|
|
|
For the Kleene logic variants, therefore:
|
|
|
|
* "true AND null", "null AND true" give "null" (the result is undefined)
|
|
* "true OR null", "null OR true" give "true"
|
|
* "false AND null", "null AND false" give "false"
|
|
* "false OR null", "null OR false" give "null" (the result is undefined)
|
|
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| Function name | Arity | Input types | Output type |
|
|
+==========================+============+====================+=====================+
|
|
| and | Binary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| and_kleene | Binary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| and_not | Binary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| and_not_kleene | Binary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| invert | Unary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| or | Binary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| or_kleene | Binary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
| xor | Binary | Boolean | Boolean |
|
|
+--------------------------+------------+--------------------+---------------------+
|
|
|
|
.. _Kleene logic: https://en.wikipedia.org/wiki/Three-valued_logic#Kleene_and_Priest_logics
|
|
|
|
String predicates
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
These functions classify the input string elements according to their character
|
|
contents. An empty string element emits false in the output. For ASCII
|
|
variants of the functions (prefixed ``ascii_``), a string element with non-ASCII
|
|
characters emits false in the output.
|
|
|
|
The first set of functions operates on a character-per-character basis,
|
|
and emit true in the output if the input contains only characters of a
|
|
given class:
|
|
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Matched character class | Notes |
|
|
+====================+=======+=============+=============+=========================+=======+
|
|
| ascii_is_alnum | Unary | String-like | Boolean | Alphanumeric ASCII | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| ascii_is_alpha | Unary | String-like | Boolean | Alphabetic ASCII | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| ascii_is_decimal | Unary | String-like | Boolean | Decimal ASCII | \(1) |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| ascii_is_lower | Unary | String-like | Boolean | Lowercase ASCII | \(2) |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| ascii_is_printable | Unary | String-like | Boolean | Printable ASCII | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| ascii_is_space | Unary | String-like | Boolean | Whitespace ASCII | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| ascii_is_upper | Unary | String-like | Boolean | Uppercase ASCII | \(2) |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_alnum | Unary | String-like | Boolean | Alphanumeric Unicode | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_alpha | Unary | String-like | Boolean | Alphabetic Unicode | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_decimal | Unary | String-like | Boolean | Decimal Unicode | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_digit | Unary | String-like | Boolean | Unicode digit | \(3) |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_lower | Unary | String-like | Boolean | Lowercase Unicode | \(2) |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_numeric | Unary | String-like | Boolean | Numeric Unicode | \(4) |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_printable | Unary | String-like | Boolean | Printable Unicode | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_space | Unary | String-like | Boolean | Whitespace Unicode | |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
| utf8_is_upper | Unary | String-like | Boolean | Uppercase Unicode | \(2) |
|
|
+--------------------+-------+-------------+-------------+-------------------------+-------+
|
|
|
|
* \(1) Also matches all numeric ASCII characters and all ASCII digits.
|
|
|
|
* \(2) Non-cased characters, such as punctuation, do not match.
|
|
|
|
* \(3) This is currently the same as ``utf8_is_decimal``.
|
|
|
|
* \(4) Unlike ``utf8_is_decimal``, non-decimal numeric characters also match.
|
|
|
|
The second set of functions also consider the character order in a string
|
|
element:
|
|
|
|
+--------------------------+------------+--------------------+---------------------+---------+
|
|
| Function name | Arity | Input types | Output type | Notes |
|
|
+==========================+============+====================+=====================+=========+
|
|
| ascii_is_title | Unary | String-like | Boolean | \(1) |
|
|
+--------------------------+------------+--------------------+---------------------+---------+
|
|
| utf8_is_title | Unary | String-like | Boolean | \(1) |
|
|
+--------------------------+------------+--------------------+---------------------+---------+
|
|
|
|
* \(1) Output is true iff the input string element is title-cased, i.e. any
|
|
word starts with an uppercase character, followed by lowercase characters.
|
|
Word boundaries are defined by non-cased characters.
|
|
|
|
The third set of functions examines string elements on a byte-per-byte basis:
|
|
|
|
+--------------------------+------------+--------------------+---------------------+---------+
|
|
| Function name | Arity | Input types | Output type | Notes |
|
|
+==========================+============+====================+=====================+=========+
|
|
| string_is_ascii | Unary | String-like | Boolean | \(1) |
|
|
+--------------------------+------------+--------------------+---------------------+---------+
|
|
|
|
* \(1) Output is true iff the input string element contains only ASCII characters,
|
|
i.e. only bytes in [0, 127].
|
|
|
|
String transforms
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=========================+========+=========================================+========================+===================================+=======+
|
|
| ascii_capitalize | Unary | String-like | String-like | | \(1) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| ascii_lower | Unary | String-like | String-like | | \(1) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| ascii_reverse | Unary | String-like | String-like | | \(2) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| ascii_swapcase | Unary | String-like | String-like | | \(1) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| ascii_title | Unary | String-like | String-like | | \(1) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| ascii_upper | Unary | String-like | String-like | | \(1) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| binary_length | Unary | Binary- or String-like | Int32 or Int64 | | \(3) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| binary_repeat | Binary | Binary/String (Arg 0); Integral (Arg 1) | Binary- or String-like | | \(4) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| binary_replace_slice | Unary | String-like | Binary- or String-like | :struct:`ReplaceSliceOptions` | \(5) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| binary_reverse | Unary | Binary | Binary | | \(6) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| replace_substring | Unary | String-like | String-like | :struct:`ReplaceSubstringOptions` | \(7) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| replace_substring_regex | Unary | String-like | String-like | :struct:`ReplaceSubstringOptions` | \(8) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_capitalize | Unary | String-like | String-like | | \(9) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_length | Unary | String-like | Int32 or Int64 | | \(10) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_lower | Unary | String-like | String-like | | \(9) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_replace_slice | Unary | String-like | String-like | :struct:`ReplaceSliceOptions` | \(7) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_reverse | Unary | String-like | String-like | | \(11) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_swapcase | Unary | String-like | String-like | | \(9) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_title | Unary | String-like | String-like | | \(9) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
| utf8_upper | Unary | String-like | String-like | | \(9) |
|
|
+-------------------------+--------+-----------------------------------------+------------------------+-----------------------------------+-------+
|
|
|
|
* \(1) Each ASCII character in the input is converted to lowercase or
|
|
uppercase. Non-ASCII characters are left untouched.
|
|
|
|
* \(2) ASCII input is reversed to the output. If non-ASCII characters
|
|
are present, ``Invalid`` :class:`Status` will be returned.
|
|
|
|
* \(3) Output is the physical length in bytes of each input element. Output
|
|
type is Int32 for Binary/String, Int64 for LargeBinary/LargeString.
|
|
|
|
* \(4) Repeat the input binary string a given number of times.
|
|
|
|
* \(5) Replace the slice of the substring from :member:`ReplaceSliceOptions::start`
|
|
(inclusive) to :member:`ReplaceSliceOptions::stop` (exclusive) by
|
|
:member:`ReplaceSubstringOptions::replacement`. The binary kernel measures the
|
|
slice in bytes, while the UTF8 kernel measures the slice in codeunits.
|
|
|
|
* \(6) Perform a byte-level reverse.
|
|
|
|
* \(7) Replace non-overlapping substrings that match to
|
|
:member:`ReplaceSubstringOptions::pattern` by
|
|
:member:`ReplaceSubstringOptions::replacement`. If
|
|
:member:`ReplaceSubstringOptions::max_replacements` != -1, it determines the
|
|
maximum number of replacements made, counting from the left.
|
|
|
|
* \(8) Replace non-overlapping substrings that match to the regular expression
|
|
:member:`ReplaceSubstringOptions::pattern` by
|
|
:member:`ReplaceSubstringOptions::replacement`, using the Google RE2 library. If
|
|
:member:`ReplaceSubstringOptions::max_replacements` != -1, it determines the
|
|
maximum number of replacements made, counting from the left. Note that if the
|
|
pattern contains groups, backreferencing can be used.
|
|
|
|
* \(9) Each UTF8-encoded character in the input is converted to lowercase or
|
|
uppercase.
|
|
|
|
* \(10) Output is the number of characters (not bytes) of each input element.
|
|
Output type is Int32 for String, Int64 for LargeString.
|
|
|
|
* \(11) Each UTF8-encoded code unit is written in reverse order to the output.
|
|
If the input is not valid UTF8, then the output is undefined (but the size of output
|
|
buffers will be preserved).
|
|
|
|
String padding
|
|
~~~~~~~~~~~~~~
|
|
|
|
These functions append/prepend a given padding byte (ASCII) or codepoint (UTF8) in
|
|
order to center (center), right-align (lpad), or left-align (rpad) a string.
|
|
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
| Function name | Arity | Input types | Output type | Options class |
|
|
+==========================+============+=========================+=====================+========================================+
|
|
| ascii_center | Unary | String-like | String-like | :struct:`PadOptions` |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
| ascii_lpad | Unary | String-like | String-like | :struct:`PadOptions` |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
| ascii_rpad | Unary | String-like | String-like | :struct:`PadOptions` |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
| utf8_center | Unary | String-like | String-like | :struct:`PadOptions` |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
| utf8_lpad | Unary | String-like | String-like | :struct:`PadOptions` |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
| utf8_rpad | Unary | String-like | String-like | :struct:`PadOptions` |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
| utf8_zero_fill | Unary | String-like | String-like | :struct:`ZeroFillOptions` |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+
|
|
|
|
String trimming
|
|
~~~~~~~~~~~~~~~
|
|
|
|
These functions trim off characters on both sides (trim), or the left (ltrim) or right side (rtrim).
|
|
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+==========================+============+=========================+=====================+========================================+=========+
|
|
| ascii_ltrim | Unary | String-like | String-like | :struct:`TrimOptions` | \(1) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| ascii_ltrim_whitespace | Unary | String-like | String-like | | \(2) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| ascii_rtrim | Unary | String-like | String-like | :struct:`TrimOptions` | \(1) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| ascii_rtrim_whitespace | Unary | String-like | String-like | | \(2) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| ascii_trim | Unary | String-like | String-like | :struct:`TrimOptions` | \(1) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| ascii_trim_whitespace | Unary | String-like | String-like | | \(2) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| utf8_ltrim | Unary | String-like | String-like | :struct:`TrimOptions` | \(3) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| utf8_ltrim_whitespace | Unary | String-like | String-like | | \(4) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| utf8_rtrim | Unary | String-like | String-like | :struct:`TrimOptions` | \(3) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| utf8_rtrim_whitespace | Unary | String-like | String-like | | \(4) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| utf8_trim | Unary | String-like | String-like | :struct:`TrimOptions` | \(3) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
| utf8_trim_whitespace | Unary | String-like | String-like | | \(4) |
|
|
+--------------------------+------------+-------------------------+---------------------+----------------------------------------+---------+
|
|
|
|
* \(1) Only characters specified in :member:`TrimOptions::characters` will be
|
|
trimmed off. Both the input string and the ``characters`` argument are
|
|
interpreted as ASCII characters.
|
|
|
|
* \(2) Only trim off ASCII whitespace characters (``'\t'``, ``'\n'``, ``'\v'``,
|
|
``'\f'``, ``'\r'`` and ``' '``).
|
|
|
|
* \(3) Only characters specified in :member:`TrimOptions::characters` will be
|
|
trimmed off.
|
|
|
|
* \(4) Only trim off Unicode whitespace characters.
|
|
|
|
String splitting
|
|
~~~~~~~~~~~~~~~~
|
|
|
|
These functions split strings into lists of strings. All kernels can optionally
|
|
be configured with a ``max_splits`` and a ``reverse`` parameter, where
|
|
``max_splits == -1`` means no limit (the default). When ``reverse`` is true,
|
|
the splitting is done starting from the end of the string; this is only relevant
|
|
when a positive ``max_splits`` is given.
|
|
|
|
+--------------------------+------------+-------------------------+-------------------+----------------------------------+---------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+==========================+============+=========================+===================+==================================+=========+
|
|
| ascii_split_whitespace | Unary | String-like | List-like | :struct:`SplitOptions` | \(1) |
|
|
+--------------------------+------------+-------------------------+-------------------+----------------------------------+---------+
|
|
| split_pattern | Unary | Binary- or String-like | List-like | :struct:`SplitPatternOptions` | \(2) |
|
|
+--------------------------+------------+-------------------------+-------------------+----------------------------------+---------+
|
|
| split_pattern_regex | Unary | Binary- or String-like | List-like | :struct:`SplitPatternOptions` | \(3) |
|
|
+--------------------------+------------+-------------------------+-------------------+----------------------------------+---------+
|
|
| utf8_split_whitespace | Unary | String-like | List-like | :struct:`SplitOptions` | \(4) |
|
|
+--------------------------+------------+-------------------------+-------------------+----------------------------------+---------+
|
|
|
|
* \(1) A non-zero length sequence of ASCII defined whitespace bytes
|
|
(``'\t'``, ``'\n'``, ``'\v'``, ``'\f'``, ``'\r'`` and ``' '``) is seen
|
|
as separator.
|
|
|
|
* \(2) The string is split when an exact pattern is found (the pattern itself
|
|
is not included in the output).
|
|
|
|
* \(3) The string is split when a regex match is found (the matched
|
|
substring itself is not included in the output).
|
|
|
|
* \(4) A non-zero length sequence of Unicode defined whitespace codepoints
|
|
is seen as separator.
|
|
|
|
String component extraction
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
+--------------------+-------+------------------------+-------------+-----------------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+====================+=======+========================+=============+===================================+=======+
|
|
| extract_regex | Unary | Binary- or String-like | Struct | :struct:`ExtractRegexOptions` | \(1) |
|
|
+--------------------+-------+------------------------+-------------+-----------------------------------+-------+
|
|
| extract_regex_span | Unary | Binary- or String-like | Struct | :struct:`ExtractRegexSpanOptions` | \(2) |
|
|
+--------------------+-------+------------------------+-------------+-----------------------------------+-------+
|
|
|
|
* \(1) Extract substrings defined by a regular expression using the Google RE2
|
|
library. The output struct field names refer to the named capture groups,
|
|
e.g. 'letter' and 'digit' for the regular expression
|
|
``(?P<letter>[ab])(?P<digit>\\d)``.
|
|
|
|
* \(2) Extract the offset and length of substrings defined by a regular expression
|
|
using the Google RE2 library. The output struct field names refer to the named
|
|
capture groups, e.g. 'letter' and 'digit' for the regular expression
|
|
``(?P<letter>[ab])(?P<digit>\\d)``. Each output struct field is a fixed size list
|
|
of two integers: the index to the start of the captured group and the length
|
|
of the captured group, respectively.
|
|
|
|
String joining
|
|
~~~~~~~~~~~~~~
|
|
|
|
These functions do the inverse of string splitting.
|
|
|
|
+--------------------------+---------+----------------------------------+------------------------+------------------------+-----------------------+---------+
|
|
| Function name | Arity | Input type 1 | Input type 2 | Output type | Options class | Notes |
|
|
+==========================+=========+==================================+========================+========================+=======================+=========+
|
|
| binary_join | Binary | List of Binary- or String-like | String-like | String-like | | \(1) |
|
|
+--------------------------+---------+----------------------------------+------------------------+------------------------+-----------------------+---------+
|
|
| binary_join_element_wise | Varargs | Binary- or String-like (varargs) | Binary- or String-like | Binary- or String-like | :struct:`JoinOptions` | \(2) |
|
|
+--------------------------+---------+----------------------------------+------------------------+------------------------+-----------------------+---------+
|
|
|
|
* \(1) The first input must be an array, while the second can be a scalar or array.
|
|
Each list of values in the first input is joined using each second input
|
|
as separator. If any input list is null or contains a null, the corresponding
|
|
output will be null.
|
|
|
|
* \(2) All arguments are concatenated element-wise, with the last argument treated
|
|
as the separator (scalars are recycled in either case). Null separators emit
|
|
null. If any other argument is null, by default the corresponding output will be
|
|
null, but it can instead either be skipped or replaced with a given string.
|
|
|
|
String Slicing
|
|
~~~~~~~~~~~~~~
|
|
|
|
This function transforms each sequence of the array to a subsequence, according
|
|
to start and stop indices, and a non-zero step (defaulting to 1). Slicing
|
|
semantics follow Python slicing semantics: the start index is inclusive,
|
|
the stop index exclusive; if the step is negative, the sequence is followed
|
|
in reverse order.
|
|
|
|
+--------------------------+------------+-------------------------+-------------------------+--------------------------+---------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+==========================+============+=========================+=========================+==========================+=========+
|
|
| binary_slice | Unary | Binary-like | Binary-like | :struct:`SliceOptions` | \(1) |
|
|
+--------------------------+------------+-------------------------+-------------------------+--------------------------+---------+
|
|
| utf8_slice_codeunits | Unary | String-like | String-like | :struct:`SliceOptions` | \(2) |
|
|
+--------------------------+------------+-------------------------+-------------------------+--------------------------+---------+
|
|
|
|
* \(1) Slice string into a substring defined by (``start``, ``stop``, ``step``)
|
|
as given by :struct:`SliceOptions` where ``start`` and ``stop`` are measured
|
|
in bytes. Null inputs emit null.
|
|
* \(2) Slice string into a substring defined by (``start``, ``stop``, ``step``)
|
|
as given by :struct:`SliceOptions` where ``start`` and ``stop`` are measured
|
|
in codeunits. Null inputs emit null.
|
|
|
|
Containment tests
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=======================+=======+===================================+================+=================================+=======+
|
|
| count_substring | Unary | Binary- or String-like | Int32 or Int64 | :struct:`MatchSubstringOptions` | \(1) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| count_substring_regex | Unary | Binary- or String-like | Int32 or Int64 | :struct:`MatchSubstringOptions` | \(1) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| ends_with | Unary | Binary- or String-like | Boolean | :struct:`MatchSubstringOptions` | \(2) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| find_substring | Unary | Binary- and String-like | Int32 or Int64 | :struct:`MatchSubstringOptions` | \(3) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| find_substring_regex | Unary | Binary- and String-like | Int32 or Int64 | :struct:`MatchSubstringOptions` | \(3) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| index_in | Unary | Boolean, Null, Numeric, Temporal, | Int32 | :struct:`SetLookupOptions` | \(4) |
|
|
| | | Binary- and String-like | | | |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| is_in | Unary | Boolean, Null, Numeric, Temporal, | Boolean | :struct:`SetLookupOptions` | \(5) |
|
|
| | | Binary- and String-like | | | |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| match_like | Unary | Binary- or String-like | Boolean | :struct:`MatchSubstringOptions` | \(6) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| match_substring | Unary | Binary- or String-like | Boolean | :struct:`MatchSubstringOptions` | \(7) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| match_substring_regex | Unary | Binary- or String-like | Boolean | :struct:`MatchSubstringOptions` | \(8) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| starts_with | Unary | Binary- or String-like | Boolean | :struct:`MatchSubstringOptions` | \(2) |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
|
|
* \(1) Output is the number of occurrences of
|
|
:member:`MatchSubstringOptions::pattern` in the corresponding input
|
|
string. Output type is Int32 for Binary/String, Int64
|
|
for LargeBinary/LargeString.
|
|
|
|
* \(2) Output is true iff :member:`MatchSubstringOptions::pattern`
|
|
is a suffix/prefix of the corresponding input.
|
|
|
|
* \(3) Output is the index of the first occurrence of
|
|
:member:`MatchSubstringOptions::pattern` in the corresponding input
|
|
string, otherwise -1. Output type is Int32 for Binary/String, Int64
|
|
for LargeBinary/LargeString.
|
|
|
|
* \(4) Output is the index of the corresponding input element in
|
|
:member:`SetLookupOptions::value_set`, if found there. Otherwise,
|
|
output is null.
|
|
|
|
* \(5) Output is true iff the corresponding input element is equal to one
|
|
of the elements in :member:`SetLookupOptions::value_set`.
|
|
|
|
* \(6) Output is true iff the SQL-style LIKE pattern
|
|
:member:`MatchSubstringOptions::pattern` fully matches the
|
|
corresponding input element. That is, ``%`` will match any number of
|
|
characters, ``_`` will match exactly one character, and any other
|
|
character matches itself. To match a literal percent sign or
|
|
underscore, precede the character with a backslash.
|
|
|
|
* \(7) Output is true iff :member:`MatchSubstringOptions::pattern`
|
|
is a substring of the corresponding input element.
|
|
|
|
* \(8) Output is true iff :member:`MatchSubstringOptions::pattern`
|
|
matches the corresponding input element at any position.
|
|
|
|
Categorizations
|
|
~~~~~~~~~~~~~~~
|
|
|
|
+-------------------+------------+-------------------------+---------------------+------------------------+---------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+===================+============+=========================+=====================+========================+=========+
|
|
| is_finite | Unary | Null, Numeric | Boolean | | \(1) |
|
|
+-------------------+------------+-------------------------+---------------------+------------------------+---------+
|
|
| is_inf | Unary | Null, Numeric | Boolean | | \(2) |
|
|
+-------------------+------------+-------------------------+---------------------+------------------------+---------+
|
|
| is_nan | Unary | Null, Numeric | Boolean | | \(3) |
|
|
+-------------------+------------+-------------------------+---------------------+------------------------+---------+
|
|
| is_null | Unary | Any | Boolean | :struct:`NullOptions` | \(4) |
|
|
+-------------------+------------+-------------------------+---------------------+------------------------+---------+
|
|
| is_valid | Unary | Any | Boolean | | \(5) |
|
|
+-------------------+------------+-------------------------+---------------------+------------------------+---------+
|
|
| true_unless_null | Unary | Any | Boolean | | \(6) |
|
|
+-------------------+------------+-------------------------+---------------------+------------------------+---------+
|
|
|
|
* \(1) Output is true iff the corresponding input element is finite (neither Infinity,
|
|
-Infinity, nor NaN). Hence, for Decimal and integer inputs this always returns true.
|
|
|
|
* \(2) Output is true iff the corresponding input element is Infinity/-Infinity.
|
|
Hence, for Decimal and integer inputs this always returns false.
|
|
|
|
* \(3) Output is true iff the corresponding input element is NaN.
|
|
Hence, for Decimal and integer inputs this always returns false.
|
|
|
|
* \(4) Output is true iff the corresponding input element is null. NaN values
|
|
can also be considered null by setting :member:`NullOptions::nan_is_null`.
|
|
|
|
* \(5) Output is true iff the corresponding input element is non-null, else false.
|
|
|
|
* \(6) Output is true iff the corresponding input element is non-null, else null.
|
|
Mostly intended for expression simplification/guarantees.
|
|
|
|
.. _cpp-compute-scalar-selections:
|
|
|
|
Selecting / multiplexing
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
For each "row" of input values, these functions emit one of the input values,
|
|
depending on a condition.
|
|
|
|
+------------------+------------+---------------------------------------------------+---------------------+---------+
|
|
| Function name | Arity | Input types | Output type | Notes |
|
|
+==================+============+===================================================+=====================+=========+
|
|
| case_when | Varargs | Struct of Boolean (Arg 0), Any (rest) | Input type | \(1) |
|
|
+------------------+------------+---------------------------------------------------+---------------------+---------+
|
|
| choose | Varargs | Integral (Arg 0), Fixed-width/Binary-like (rest) | Input type | \(2) |
|
|
+------------------+------------+---------------------------------------------------+---------------------+---------+
|
|
| coalesce | Varargs | Any | Input type | \(3) |
|
|
+------------------+------------+---------------------------------------------------+---------------------+---------+
|
|
| if_else | Ternary | Boolean (Arg 0), Any (rest) | Input type | \(4) |
|
|
+------------------+------------+---------------------------------------------------+---------------------+---------+
|
|
|
|
* \(1) This function acts like a SQL "case when" statement or switch-case. The
|
|
input is a "condition" value, which is a struct of Booleans, followed by the
|
|
values for each "branch". There must be either exactly one value argument for
|
|
each child of the condition struct, or one more value argument than children
|
|
(in which case we have an "else" or "default" value). The output is of the
|
|
same type as the value inputs; each row will be the corresponding value from
|
|
the first value datum for which the corresponding Boolean is true, or the
|
|
corresponding value from the "default" input, or null otherwise.
|
|
|
|
Note that currently, while all types are supported, dictionaries will be
|
|
unpacked.
|
|
|
|
* \(2) The first input must be an integral type. The rest of the arguments can be
|
|
any type, but must all be the same type or promotable to a common type. Each
|
|
value of the first input (the 'index') is used as a zero-based index into the
|
|
remaining arguments (i.e. index 0 is the second argument, index 1 is the third
|
|
argument, etc.), and the value of the output for that row will be the
|
|
corresponding value of the selected input at that row. If the index is null,
|
|
then the output will also be null.
|
|
|
|
* \(3) Each row of the output will be the corresponding value of the first
|
|
input which is non-null for that row, otherwise null.
|
|
|
|
* \(4) First input must be a Boolean scalar or array. Second and third inputs
|
|
could be scalars or arrays and must be of the same type. Output is an array
|
|
(or scalar if all inputs are scalar) of the same type as the second/ third
|
|
input. If the nulls present on the first input, they will be promoted to the
|
|
output, otherwise nulls will be chosen based on the first input values.
|
|
|
|
Also see: :ref:`replace_with_mask <cpp-compute-vector-replace-functions>`.
|
|
|
|
Structural transforms
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
+---------------------+------------+-------------+------------------+------------------------------+--------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=====================+============+=============+==================+==============================+========+
|
|
| list_value_length | Unary | List-like | Int32 or Int64 | | \(1) |
|
|
+---------------------+------------+-------------+------------------+------------------------------+--------+
|
|
| make_struct | Varargs | Any | Struct | :struct:`MakeStructOptions` | \(2) |
|
|
+---------------------+------------+-------------+------------------+------------------------------+--------+
|
|
|
|
* \(1) Each output element is the length of the corresponding input element
|
|
(null if input is null). Output type is Int32 for List, ListView, and
|
|
FixedSizeList, Int64 for LargeList and LargeListView.
|
|
|
|
* \(2) The output struct's field types are the types of its arguments. The
|
|
field names are specified using an instance of :struct:`MakeStructOptions`.
|
|
The output shape will be scalar if all inputs are scalar, otherwise any
|
|
scalars will be broadcast to arrays.
|
|
|
|
Conversions
|
|
~~~~~~~~~~~
|
|
|
|
A general conversion function named ``cast`` is provided which accepts a large
|
|
number of input and output types. The type to cast to can be passed in a
|
|
:struct:`CastOptions` instance. As an alternative, the same service is
|
|
provided by a concrete function :func:`~arrow::compute::Cast`.
|
|
|
|
+-----------------+------------+--------------------+------------------+--------------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=================+============+====================+==================+================================+=======+
|
|
| ceil_temporal | Unary | Temporal | Temporal | :struct:`RoundTemporalOptions` | |
|
|
+-----------------+------------+--------------------+------------------+--------------------------------+-------+
|
|
| floor_temporal | Unary | Temporal | Temporal | :struct:`RoundTemporalOptions` | |
|
|
+-----------------+------------+--------------------+------------------+--------------------------------+-------+
|
|
| round_temporal | Unary | Temporal | Temporal | :struct:`RoundTemporalOptions` | |
|
|
+-----------------+------------+--------------------+------------------+--------------------------------+-------+
|
|
| cast | Unary | Many | Variable | :struct:`CastOptions` | |
|
|
+-----------------+------------+--------------------+------------------+--------------------------------+-------+
|
|
| strftime | Unary | Temporal | String | :struct:`StrftimeOptions` | \(1) |
|
|
+-----------------+------------+--------------------+------------------+--------------------------------+-------+
|
|
| strptime | Unary | String-like | Timestamp | :struct:`StrptimeOptions` | |
|
|
+-----------------+------------+--------------------+------------------+--------------------------------+-------+
|
|
|
|
The conversions available with ``cast`` are listed below. In all cases, a
|
|
null input value is converted into a null output value.
|
|
|
|
* \(1) Output precision of ``%S`` (seconds) flag depends on the input timestamp
|
|
precision. Timestamps with second precision are represented as integers while
|
|
milliseconds, microsecond and nanoseconds are represented as fixed floating
|
|
point numbers with 3, 6 and 9 decimal places respectively. To obtain integer
|
|
seconds, cast to timestamp with second resolution.
|
|
The character for the decimal point is localized according to the locale.
|
|
See `detailed formatting documentation`_ for descriptions of other flags.
|
|
|
|
.. _detailed formatting documentation: https://howardhinnant.github.io/date/date.html#to_stream_formatting
|
|
|
|
**Truth value extraction**
|
|
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| Input type | Output type | Notes |
|
|
+=============================+====================================+==============+
|
|
| Binary- and String-like | Boolean | \(1) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| Numeric | Boolean | \(2) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
|
|
* \(1) Output is true iff the corresponding input value has non-zero length.
|
|
|
|
* \(2) Output is true iff the corresponding input value is non-zero.
|
|
|
|
**Same-kind conversion**
|
|
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| Input type | Output type | Notes |
|
|
+=============================+====================================+==============+
|
|
| Int32 | 32-bit Temporal | \(1) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| Int64 | 64-bit Temporal | \(1) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| (Large)Binary | (Large)String | \(2) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| (Large)String | (Large)Binary | \(3) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| Numeric | Numeric | \(4) \(5) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| 32-bit Temporal | Int32 | \(1) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| 64-bit Temporal | Int64 | \(1) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
| Temporal | Temporal | \(4) \(5) |
|
|
+-----------------------------+------------------------------------+--------------+
|
|
|
|
* \(1) No-operation cast: the raw values are kept identical, only
|
|
the type is changed.
|
|
|
|
* \(2) Validates the contents if :member:`CastOptions::allow_invalid_utf8`
|
|
is false.
|
|
|
|
* \(3) No-operation cast: only the type is changed.
|
|
|
|
* \(4) Overflow and truncation checks are enabled depending on
|
|
the given :struct:`CastOptions`.
|
|
|
|
* \(5) Not all such casts have been implemented.
|
|
|
|
**String representations**
|
|
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Input type | Output type | Notes |
|
|
+=============================+====================================+=========+
|
|
| Boolean | String-like | |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Numeric | String-like | |
|
|
+-----------------------------+------------------------------------+---------+
|
|
|
|
**Generic conversions**
|
|
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Input type | Output type | Notes |
|
|
+=============================+====================================+=========+
|
|
| Dictionary | Dictionary value type | \(1) |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Extension | Extension storage type | |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Struct | Struct | \(2) |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| List-like | List-like or (Large)ListView | \(3) |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| (Large)ListView | List-like or (Large)ListView | \(4) |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Map | Map or List of two-field struct | \(5) |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Null | Any | |
|
|
+-----------------------------+------------------------------------+---------+
|
|
| Any | Extension | \(6) |
|
|
+-----------------------------+------------------------------------+---------+
|
|
|
|
* \(1) The dictionary indices are unchanged, the dictionary values are
|
|
cast from the input value type to the output value type (if a conversion
|
|
is available).
|
|
|
|
* \(2) Fields are casted primarily by matching field names between the input
|
|
and output type. For duplicate field names, their relative order is preserved,
|
|
with each input field used for one or zero output fields. This allows casting
|
|
to a subset or re-ordered field names. If a nullable field in the output type
|
|
has no matching field name in the input type, it will be filled with nulls.
|
|
Casting a field from nullable to not null is supported if the input data
|
|
contains zero nulls.
|
|
|
|
* \(3) The list offsets are unchanged, the list values are cast from the
|
|
input value type to the output value type (if a conversion is
|
|
available). If the output type is (Large)ListView, then sizes are
|
|
derived from the offsets.
|
|
|
|
* \(4) If output type is list-like, offsets (consequently, the values array)
|
|
might have to be rebuilt to be sorted and spaced adequately. If output type is
|
|
a list-view type, the offsets and sizes are unchanged. In any case, the list
|
|
values are cast from the input value type to the output value type (if a
|
|
conversion is available).
|
|
|
|
* \(5) Offsets are unchanged, the keys and values are cast from respective input
|
|
to output types (if a conversion is available). If output type is a list of
|
|
struct, the key field is output as the first field and the value field the
|
|
second field, regardless of field names chosen.
|
|
|
|
* \(6) Any input type that can be cast to the resulting extension's storage type.
|
|
This excludes extension types, unless being cast to the same extension type.
|
|
|
|
Temporal component extraction
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
These functions extract datetime components (year, month, day, etc) from temporal types.
|
|
For timestamps inputs with non-empty timezone, localized timestamp components will be returned.
|
|
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+====================+============+===================+===============+============================+=======+
|
|
| day | Unary | Temporal | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| day_of_week | Unary | Temporal | Int64 | :struct:`DayOfWeekOptions` | \(1) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| day_of_year | Unary | Temporal | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| hour | Unary | Timestamp, Time | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| is_dst | Unary | Timestamp | Boolean | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| iso_week | Unary | Temporal | Int64 | | \(2) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| iso_year | Unary | Temporal | Int64 | | \(2) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| iso_calendar | Unary | Temporal | Struct | | \(3) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| is_leap_year | Unary | Timestamp, Date | Boolean | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| microsecond | Unary | Timestamp, Time | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| millisecond | Unary | Timestamp, Time | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| minute | Unary | Timestamp, Time | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| month | Unary | Temporal | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| nanosecond | Unary | Timestamp, Time | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| quarter | Unary | Temporal | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| second | Unary | Timestamp, Time | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| subsecond | Unary | Timestamp, Time | Float64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| us_week | Unary | Temporal | Int64 | | \(4) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| us_year | Unary | Temporal | Int64 | | \(4) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| week | Unary | Timestamp | Int64 | :struct:`WeekOptions` | \(5) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| year | Unary | Temporal | Int64 | | |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
| year_month_day | Unary | Temporal | Struct | | \(6) |
|
|
+--------------------+------------+-------------------+---------------+----------------------------+-------+
|
|
|
|
* \(1) Outputs the number of the day of the week. By default week begins on Monday
|
|
represented by 0 and ends on Sunday represented by 6. Day numbering can start with 0 or 1 based on
|
|
:member:`DayOfWeekOptions::count_from_zero` parameter. :member:`DayOfWeekOptions::week_start` can be
|
|
used to set the starting day of the week using ISO convention (Monday=1, Sunday=7).
|
|
:member:`DayOfWeekOptions::week_start` parameter is not affected by :member:`DayOfWeekOptions::count_from_zero`.
|
|
|
|
* \(2) First ISO week has the majority (4 or more) of it's days in January. ISO year
|
|
starts with the first ISO week. ISO week starts on Monday.
|
|
See `ISO 8601 week date definition`_ for more details.
|
|
|
|
* \(3) Output is a ``{"iso_year": output type, "iso_week": output type, "iso_day_of_week": output type}`` Struct.
|
|
|
|
* \(4) First US week has the majority (4 or more) of its days in January. US year
|
|
starts with the first US week. US week starts on Sunday.
|
|
|
|
* \(5) Returns week number allowing for setting several parameters.
|
|
If :member:`WeekOptions::week_starts_monday` is true, the week starts with Monday, else Sunday if false.
|
|
If :member:`WeekOptions::count_from_zero` is true, dates from the current year that fall into the last ISO week
|
|
of the previous year are numbered as week 0, else week 52 or 53 if false.
|
|
If :member:`WeekOptions::first_week_is_fully_in_year` is true, the first week (week 1) must fully be in January;
|
|
else if false, a week that begins on December 29, 30, or 31 is considered the first week of the new year.
|
|
|
|
* \(6) Output is a ``{"year": int64(), "month": int64(), "day": int64()}`` Struct.
|
|
|
|
.. _ISO 8601 week date definition: https://en.wikipedia.org/wiki/ISO_week_date#First_week
|
|
|
|
Temporal difference
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
These functions compute the difference between two timestamps in the
|
|
specified unit. The difference is determined by the number of
|
|
boundaries crossed, not the span of time. For example, the difference
|
|
in days between 23:59:59 on one day and 00:00:01 on the next day is
|
|
one day (since midnight was crossed), not zero days (even though less
|
|
than 24 hours elapsed). Additionally, if the timestamp has a defined
|
|
timezone, the difference is calculated in the local timezone. For
|
|
instance, the difference in years between "2019-12-31 18:00:00-0500"
|
|
and "2019-12-31 23:00:00-0500" is zero years, because the local year
|
|
is the same, even though the UTC years would be different.
|
|
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| Function name | Arity | Input types | Output type | Options class |
|
|
+=================================+============+===================+=======================+============================+
|
|
| day_time_interval_between | Binary | Temporal | DayTime interval | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| days_between | Binary | Timestamp, Date | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| hours_between | Binary | Temporal | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| microseconds_between | Binary | Temporal | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| milliseconds_between | Binary | Temporal | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| minutes_between | Binary | Temporal | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| month_day_nano_interval_between | Binary | Temporal | MonthDayNano interval | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| month_interval_between | Binary | Timestamp, Date | Month interval | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| nanoseconds_between | Binary | Temporal | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| quarters_between | Binary | Timestamp, Date | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| seconds_between | Binary | Temporal | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| weeks_between | Binary | Timestamp, Date | Int64 | :struct:`DayOfWeekOptions` |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
| years_between | Binary | Timestamp, Date | Int64 | |
|
|
+---------------------------------+------------+-------------------+-----------------------+----------------------------+
|
|
|
|
Timezone handling
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
``assume_timezone`` function is meant to be used when an external system produces
|
|
"timezone-naive" timestamps which need to be converted to "timezone-aware"
|
|
timestamps (see for example the `definition
|
|
<https://docs.python.org/3/library/datetime.html#aware-and-naive-objects>`__
|
|
in the Python documentation).
|
|
|
|
Input timestamps are assumed to be relative to the timezone given in
|
|
:member:`AssumeTimezoneOptions::timezone`. They are converted to
|
|
UTC-relative timestamps with the timezone metadata set to the above value.
|
|
An error is returned if the timestamps already have the timezone metadata set.
|
|
|
|
``local_timestamp`` function converts UTC-relative timestamps to local "timezone-naive"
|
|
timestamps. The timezone is taken from the timezone metadata of the input
|
|
timestamps. This function is the inverse of ``assume_timezone``. Please note:
|
|
**all temporal functions already operate on timestamps as if they were in local
|
|
time of the metadata provided timezone**. Using ``local_timestamp`` is only meant to be
|
|
used when an external system expects local timestamps.
|
|
|
|
+-----------------+-------+-------------+---------------+---------------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=================+=======+=============+===============+=================================+=======+
|
|
| assume_timezone | Unary | Timestamp | Timestamp | :struct:`AssumeTimezoneOptions` | \(1) |
|
|
+-----------------+-------+-------------+---------------+---------------------------------+-------+
|
|
| local_timestamp | Unary | Timestamp | Timestamp | | \(2) |
|
|
+-----------------+-------+-------------+---------------+---------------------------------+-------+
|
|
|
|
* \(1) In addition to the timezone value, :struct:`AssumeTimezoneOptions`
|
|
allows choosing the behaviour when a timestamp is ambiguous or nonexistent
|
|
in the given timezone (because of DST shifts).
|
|
|
|
Random number generation
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
This function generates an array of uniformly-distributed double-precision numbers
|
|
in range [0, 1). The options provide the length of the output and the algorithm for
|
|
generating the random numbers, using either a seed or a system-provided, platform-specific
|
|
random generator.
|
|
|
|
+--------------------+------------+---------------+-------------------------+
|
|
| Function name | Arity | Output type | Options class |
|
|
+====================+============+===============+=========================+
|
|
| random | Nullary | Float64 | :struct:`RandomOptions` |
|
|
+--------------------+------------+---------------+-------------------------+
|
|
|
|
|
|
Array-wise ("vector") functions
|
|
-------------------------------
|
|
|
|
Cumulative Functions
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Cumulative functions are vector functions that perform a running accumulation on
|
|
their input using a given binary associative operation with an identity element
|
|
(a monoid) and output an array containing the corresponding intermediate running
|
|
values. The input is expected to be of numeric type. By default these functions
|
|
do not detect overflow. They are also available in an overflow-checking variant,
|
|
suffixed ``_checked``, which returns an ``Invalid`` :class:`Status` when
|
|
overflow is detected.
|
|
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=========================+=======+=============+=============+================================+===========+
|
|
| cumulative_sum | Unary | Numeric | Numeric | :struct:`CumulativeOptions` | \(1) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| cumulative_sum_checked | Unary | Numeric | Numeric | :struct:`CumulativeOptions` | \(1) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| cumulative_prod | Unary | Numeric | Numeric | :struct:`CumulativeOptions` | \(1) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| cumulative_prod_checked | Unary | Numeric | Numeric | :struct:`CumulativeOptions` | \(1) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| cumulative_max | Unary | Numeric | Numeric | :struct:`CumulativeOptions` | \(1) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| cumulative_min | Unary | Numeric | Numeric | :struct:`CumulativeOptions` | \(1) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| cumulative_mean | Unary | Numeric | Float64 | :struct:`CumulativeOptions` | \(1) \(2) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
|
|
* \(1) CumulativeOptions has two optional parameters. The first parameter
|
|
:member:`CumulativeOptions::start` is a starting value for the running
|
|
accumulation. It has a default value of 0 for ``sum``, 1 for ``prod``, min of
|
|
input type for ``max``, and max of input type for ``min``. Specified values of
|
|
``start`` must be castable to the input type. The second parameter
|
|
:member:`CumulativeOptions::skip_nulls` is a boolean. When set to
|
|
false (the default), the first encountered null is propagated. When set to
|
|
true, each null in the input produces a corresponding null in the output and
|
|
doesn't affect the accumulation forward.
|
|
|
|
* \(2) :member:`CumulativeOptions::start` is ignored.
|
|
|
|
Statistical functions
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=========================+=======+=============+=============+================================+===========+
|
|
| winsorize | Unary | Numeric | Numeric | :struct:`WinsorizeOptions` | \(1) |
|
|
+-------------------------+-------+-------------+-------------+--------------------------------+-----------+
|
|
|
|
* \(1) Clamp values in the lower and upper quantiles to reduce the statistical
|
|
influence of outliers. The quantiles can be configured in :struct:`WinsorizeOptions`.
|
|
|
|
Associative transforms
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
+-------------------+-------+-----------------------------------+-------------+-------+
|
|
| Function name | Arity | Input types | Output type | Notes |
|
|
+===================+=======+===================================+=============+=======+
|
|
| dictionary_encode | Unary | Boolean, Null, Numeric, | Dictionary | \(1) |
|
|
| | | Temporal, Binary- and String-like | | |
|
|
+-------------------+-------+-----------------------------------+-------------+-------+
|
|
| unique | Unary | Boolean, Null, Numeric, | Input type | \(2) |
|
|
| | | Temporal, Binary- and String-like | | |
|
|
+-------------------+-------+-----------------------------------+-------------+-------+
|
|
| value_counts | Unary | Boolean, Null, Numeric, | Input type | \(3) |
|
|
| | | Temporal, Binary- and String-like | | |
|
|
+-------------------+-------+-----------------------------------+-------------+-------+
|
|
|
|
* \(1) Output is ``Dictionary(Int32, input type)``. It is a no-op if input is
|
|
already a Dictionary array.
|
|
|
|
* \(2) Duplicates are removed from the output while the original order is
|
|
maintained.
|
|
|
|
* \(3) Output is a ``{"values": input type, "counts": Int64}`` Struct.
|
|
Each output element corresponds to a unique value in the input, along
|
|
with the number of times this value has appeared.
|
|
|
|
Selections
|
|
~~~~~~~~~~
|
|
|
|
These functions select and return a subset of their input.
|
|
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
| Function name | Arity | Input type 1 | Input type 2 | Output type | Options class | Notes |
|
|
+=====================+========+================+==============+=====================+=====================================+=======+
|
|
| array_filter | Binary | Any | Boolean | Input type 1 | :struct:`FilterOptions` | \(2) |
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
| array_take | Binary | Any | Integer | Input type 1 | :struct:`TakeOptions` | \(3) |
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
| drop_null | Unary | Any | | Input type 1 | | \(1) |
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
| filter | Binary | Any | Boolean | Input type 1 | :struct:`FilterOptions` | \(2) |
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
| inverse_permutation | Unary | Signed Integer | | Signed Integer \(4) | :struct:`InversePermutationOptions` | \(5) |
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
| scatter | Binary | Any | Integer | Input type 1 | :struct:`ScatterOptions` | \(6) |
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
| take | Binary | Any | Integer | Input type 1 | :struct:`TakeOptions` | \(3) |
|
|
+---------------------+--------+----------------+--------------+---------------------+-------------------------------------+-------+
|
|
|
|
* \(1) Each element in the input is appended to the output iff it is non-null.
|
|
If the input is a record batch or table, any null value in a column drops
|
|
the entire row.
|
|
|
|
* \(2) Each element in input 1 (the values) is appended to the output iff
|
|
the corresponding element in input 2 (the filter) is true. How
|
|
nulls in the filter are handled can be configured using FilterOptions.
|
|
|
|
* \(3) For each element *i* in input 2 (the indices), the *i*'th element
|
|
in input 1 (the values) is appended to the output.
|
|
|
|
* \(4) The output type is specified in :struct:`InversePermutationOptions`.
|
|
|
|
* \(5) For *indices[i] = x*, *inverse_permutation[x] = i*. And *inverse_permutation[x]
|
|
= null* if *x* does not appear in the input indices. Indices must be in the range
|
|
of *[0, max_index]*, or null, which will be ignored. If multiple indices point to the
|
|
same value, the last one is used.
|
|
|
|
* \(6) For *indices[i] = x*, *output[x] = values[i]*. And *output[x] = null*
|
|
if *x* does not appear in the input indices. Indices must be in the range
|
|
of *[0, max_index]*, or null, in which case the corresponding value will be
|
|
ignored. If multiple indices point to the same value, the last one is used.
|
|
|
|
Containment tests
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
This function returns the indices at which array elements are non-null and non-zero.
|
|
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=======================+=======+===================================+================+=================================+=======+
|
|
| indices_nonzero | Unary | Boolean, Null, Numeric, Decimal | UInt64 | | |
|
|
+-----------------------+-------+-----------------------------------+----------------+---------------------------------+-------+
|
|
|
|
Sorts and partitions
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
By default, in these functions, nulls are considered greater than any other value
|
|
(they will be sorted or partitioned at the end of the array). Floating-point
|
|
NaN values are considered greater than any other non-null value, but smaller
|
|
than nulls. This behaviour can be changed using the ``null_placement`` setting
|
|
in the respective option classes.
|
|
|
|
.. note::
|
|
Binary- and String-like inputs are ordered lexicographically as bytestrings,
|
|
even for String types.
|
|
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=======================+============+=========================================================+===================+===============================+================+
|
|
| array_sort_indices | Unary | Boolean, Numeric, Temporal, Binary- and String-like | UInt64 | :struct:`ArraySortOptions` | \(1) \(2) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| partition_nth_indices | Unary | Boolean, Numeric, Temporal, Binary- and String-like | UInt64 | :struct:`PartitionNthOptions` | \(3) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| rank | Unary | Boolean, Numeric, Temporal, Binary- and String-like | UInt64 | :struct:`RankOptions` | \(4) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| rank_normal | Unary | Boolean, Numeric, Temporal, Binary- and String-like | Float64 | :struct:`RankQuantileOptions` | \(5) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| rank_quantile | Unary | Boolean, Numeric, Temporal, Binary- and String-like | Float64 | :struct:`RankQuantileOptions` | \(5) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| select_k_unstable | Unary | Boolean, Numeric, Temporal, Binary- and String-like | UInt64 | :struct:`SelectKOptions` | \(6) \(7) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| sort_indices | Unary | Boolean, Numeric, Temporal, Binary- and String-like | UInt64 | :struct:`SortOptions` | \(1) \(6) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
| search_sorted | Binary | Boolean, Numeric, Temporal, Binary- and String-like | UInt64 | :struct:`SearchSortedOptions` | \(8) |
|
|
+-----------------------+------------+---------------------------------------------------------+-------------------+-------------------------------+----------------+
|
|
|
|
|
|
* \(1) The output is an array of indices into the input, that define a
|
|
stable sort of the input.
|
|
|
|
* \(2) The input must be an array. The default order is ascending.
|
|
|
|
* \(3) The output is an array of indices into the input array, that define
|
|
a partial non-stable sort such that the *N*'th index points to the *N*'th
|
|
element in sorted order, and all indices before the *N*'th point to
|
|
elements less or equal to elements at or after the *N*'th (similar to
|
|
:func:`std::nth_element`). *N* is given in
|
|
:member:`PartitionNthOptions::pivot`.
|
|
|
|
* \(4) The output is a one-based numerical array of ranks.
|
|
|
|
* \(5) The output of ``rank_quantile`` is an array of quantiles strictly between
|
|
0 and 1. The ouput of ``rank_normal`` is an array of finite real values
|
|
corresponding to points in the normal distribution that reflect the input's
|
|
quantile ranks.
|
|
|
|
* \(6) The input can be an array, chunked array, record batch or
|
|
table. If the input is a record batch or table, one or more sort
|
|
keys must be specified.
|
|
|
|
* \(7) The output is an array of indices into the input, that define a
|
|
non-stable sort of the input.
|
|
|
|
* \(8) The first argument must be sorted in ascending order. If it contains
|
|
nulls, they must be clustered entirely at the start or the end, and non-null
|
|
needles are matched only against the non-null portion. The second argument
|
|
may be a scalar, array, or run-end encoded array. Null needles yield null
|
|
outputs. Both arguments must have the same logical type. A scalar needle
|
|
yields a UInt64 scalar; otherwise the result is a UInt64 array.
|
|
|
|
.. _cpp-compute-vector-structural-transforms:
|
|
|
|
Structural transforms
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
+---------------------+------------+-------------------------------------+------------------+------------------------------+--------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+=====================+============+=====================================+==================+==============================+========+
|
|
| list_element | Binary | List-like (Arg 0), Integral (Arg 1) | List value type | | \(1) |
|
|
+---------------------+------------+-------------------------------------+------------------+------------------------------+--------+
|
|
| list_flatten | Unary | List-like | List value type | | \(2) |
|
|
+---------------------+------------+-------------------------------------+------------------+------------------------------+--------+
|
|
| list_parent_indices | Unary | List-like | Int64 | | \(3) |
|
|
+---------------------+------------+-------------------------------------+------------------+------------------------------+--------+
|
|
| list_slice | Unary | List-like | List-like | :struct:`ListSliceOptions` | \(4) |
|
|
+---------------------+------------+-------------------------------------+------------------+------------------------------+--------+
|
|
| map_lookup | Unary | Map | Computed | :struct:`MapLookupOptions` | \(5) |
|
|
+---------------------+------------+-------------------------------------+------------------+------------------------------+--------+
|
|
| struct_field | Unary | Struct or Union | Computed | :struct:`StructFieldOptions` | \(6) |
|
|
+---------------------+------------+-------------------------------------+------------------+------------------------------+--------+
|
|
|
|
* \(1) Output is an array of the same length as the input list array. The
|
|
output values are the values at the specified index of each child list.
|
|
|
|
* \(2) The top level of nesting is removed: all values in the list child array,
|
|
including nulls, are appended to the output. However, nulls in the parent
|
|
list array are discarded.
|
|
|
|
* \(3) For each value in the list child array, the index at which it is found
|
|
in the list-like array is appended to the output. Indices of null lists in the
|
|
parent array might still be present in the output if they are non-empty null
|
|
lists. If the parent is a list-view, child array values that are not used by
|
|
any non-null list-view are null in the output.
|
|
|
|
* \(4) For each list element, compute the slice of that list element, then
|
|
return another list-like array of those slices. Can return either a
|
|
fixed or variable size list-like array, as determined by options provided.
|
|
|
|
* \(5) Extract either the ``FIRST``, ``LAST`` or ``ALL`` items from a
|
|
map whose key match the given query key passed via options.
|
|
The output type is an Array of items for the ``FIRST``/``LAST`` options
|
|
and an Array of List of items for the ``ALL`` option.
|
|
|
|
* \(6) Extract a child value based on a sequence of indices passed in
|
|
the options. The validity bitmap of the result will be the
|
|
intersection of all intermediate validity bitmaps. For example, for
|
|
an array with type ``struct<a: int32, b: struct<c: int64, d:
|
|
float64>>``:
|
|
|
|
* An empty sequence of indices yields the original value unchanged.
|
|
* The index ``0`` yields an array of type ``int32`` whose validity
|
|
bitmap is the intersection of the bitmap for the outermost struct
|
|
and the bitmap for the child ``a``.
|
|
* The index ``1, 1`` yields an array of type ``float64`` whose
|
|
validity bitmap is the intersection of the bitmaps for the
|
|
outermost struct, for struct ``b``, and for the child ``d``.
|
|
|
|
For unions, a validity bitmap is synthesized based on the type
|
|
codes. Also, the index is always the child index and not a type code.
|
|
Hence for array with type ``sparse_union<2: int32, 7: utf8>``:
|
|
|
|
* The index ``0`` yields an array of type ``int32``, which is valid
|
|
at an index *n* if and only if the child array ``a`` is valid at
|
|
index *n* and the type code at index *n* is 2.
|
|
* The indices ``2`` and ``7`` are invalid.
|
|
|
|
.. _cpp-compute-vector-replace-functions:
|
|
|
|
Replace functions
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
These functions create a copy of the first input with some elements
|
|
replaced, based on the remaining inputs.
|
|
|
|
+--------------------------+------------+-----------------------+--------------+--------------+--------------+-------+
|
|
| Function name | Arity | Input type 1 | Input type 2 | Input type 3 | Output type | Notes |
|
|
+==========================+============+=======================+==============+==============+==============+=======+
|
|
| fill_null_backward | Unary | Fixed-width or binary | | | Input type 1 | \(1) |
|
|
+--------------------------+------------+-----------------------+--------------+--------------+--------------+-------+
|
|
| fill_null_forward | Unary | Fixed-width or binary | | | Input type 1 | \(1) |
|
|
+--------------------------+------------+-----------------------+--------------+--------------+--------------+-------+
|
|
| replace_with_mask | Ternary | Fixed-width or binary | Boolean | Input type 1 | Input type 1 | \(2) |
|
|
+--------------------------+------------+-----------------------+--------------+--------------+--------------+-------+
|
|
|
|
* \(1) Valid values are carried forward/backward to fill null values.
|
|
* \(2) Each element in input 1 for which the corresponding Boolean in input 2
|
|
is true is replaced with the next value from input 3. A null in input 2
|
|
results in a corresponding null in the output.
|
|
|
|
Also see: :ref:`if_else <cpp-compute-scalar-selections>`.
|
|
|
|
Pairwise functions
|
|
~~~~~~~~~~~~~~~~~~
|
|
Pairwise functions are unary vector functions that perform a binary operation on
|
|
a pair of elements in the input array, typically on adjacent elements. The n-th
|
|
output is computed by applying the binary operation to the n-th and (n-p)-th inputs,
|
|
where p is the period. The default period is 1, in which case the binary
|
|
operation is applied to adjacent pairs of inputs. The period can also be
|
|
negative, in which case the n-th output is computed by applying the binary
|
|
operation to the n-th and (n+abs(p))-th inputs.
|
|
|
|
+------------------------+-------+----------------------+----------------------+--------------------------------+----------+
|
|
| Function name | Arity | Input types | Output type | Options class | Notes |
|
|
+========================+=======+======================+======================+================================+==========+
|
|
| pairwise_diff | Unary | Numeric/Temporal | Numeric/Temporal | :struct:`PairwiseOptions` | \(1)(2) |
|
|
+------------------------+-------+----------------------+----------------------+--------------------------------+----------+
|
|
| pairwise_diff_checked | Unary | Numeric/Temporal | Numeric/Temporal | :struct:`PairwiseOptions` | \(1)(3) |
|
|
+------------------------+-------+----------------------+----------------------+--------------------------------+----------+
|
|
|
|
* \(1) Computes the first order difference of an array, It internally calls
|
|
the scalar function ``Subtract`` (or the checked variant) to compute
|
|
differences, so its behavior and supported types are the same as
|
|
``Subtract``. The period can be specified in :struct:`PairwiseOptions`.
|
|
* \(2) Wraps around the result when overflow is detected.
|
|
* \(3) Returns an ``Invalid`` :class:`Status` when overflow is detected.
|