blob: f2aa19f892dd32e9583bc9ac200f344fe8d7c6cb [file] [log] [blame]
<!DOCTYPE html>
<html lang="en" data-content_root="" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Arrow Compute &#8212; Apache Arrow v17.0.0.dev52</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../_static/theme_overrides.css" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
<script src="../../_static/design-tabs.js"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'cpp/tutorials/compute_tutorial';</script>
<script>
DOCUMENTATION_OPTIONS.theme_version = '0.15.2';
DOCUMENTATION_OPTIONS.theme_switcher_json_url = '/docs/_static/versions.json';
DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'dev/';
DOCUMENTATION_OPTIONS.show_version_warning_banner = true;
</script>
<link rel="canonical" href="https://arrow.apache.org/docs/cpp/tutorials/compute_tutorial.html" />
<link rel="icon" href="../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Arrow Datasets" href="datasets_tutorial.html" />
<link rel="prev" title="Arrow File I/O" href="io_tutorial.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '20']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<img src="../../_static/arrow.png" class="logo__image only-light" alt="Apache Arrow v17.0.0.dev52 - Home"/>
<script>document.write(`<img src="../../_static/arrow-dark.png" class="logo__image only-dark" alt="Apache Arrow v17.0.0.dev52 - Home"/>`);</script>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../format/index.html">
Specifications
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../developers/index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
Implementations
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item current active">
<a class="nav-link dropdown-item nav-internal" href="../index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../java/index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-2"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-2"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-2"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-2">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<label class="sidebar-toggle secondary-toggle" for="__secondary" tabindex="0">
<span class="fa-solid fa-outdent"></span>
</label>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../format/index.html">
Specifications
</a>
</li>
<li class="nav-item">
<a class="nav-link nav-internal" href="../../developers/index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
Implementations
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item current active">
<a class="nav-link dropdown-item nav-internal" href="../index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../java/index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-3"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-3"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-3"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-3">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<nav class="bd-docs-nav bd-links"
aria-label="Section Navigation">
<p class="bd-links__title" role="heading" aria-level="1">Section Navigation</p>
<div class="bd-toc-item navbar-nav"><ul class="current nav bd-sidenav">
<li class="toctree-l1 current active has-children"><a class="reference internal" href="../getting_started.html">Getting Started</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-1"><i class="fa-solid fa-chevron-down"></i></label><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../build_system.html">Using Arrow C++ in your own project</a></li>
<li class="toctree-l2"><a class="reference internal" href="../conventions.html">Conventions</a></li>
<li class="toctree-l2"><a class="reference internal" href="basic_arrow.html">Basic Arrow Data Structures</a></li>
<li class="toctree-l2"><a class="reference internal" href="io_tutorial.html">Arrow File I/O</a></li>
<li class="toctree-l2 current active"><a class="current reference internal" href="#">Arrow Compute</a></li>
<li class="toctree-l2"><a class="reference internal" href="datasets_tutorial.html">Arrow Datasets</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../user_guide.html">User Guide</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-2"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../overview.html">High-Level Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="../memory.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../arrays.html">Arrays</a></li>
<li class="toctree-l2"><a class="reference internal" href="../datatypes.html">Data Types</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tables.html">Tabular Data</a></li>
<li class="toctree-l2"><a class="reference internal" href="../compute.html">Compute Functions</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../gandiva.html">The Gandiva Expression Compiler</a><input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-3"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../gandiva/expr_projector_filter.html">Gandiva Expression, Projector, and Filter</a></li>
<li class="toctree-l3"><a class="reference internal" href="../gandiva/external_func.html">Gandiva External Functions Development Guide</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../streaming_execution.html">Acero: A C++ streaming execution engine</a><input class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-4"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../acero/overview.html">Acero Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="../acero/user_guide.html">Acero User’s Guide</a></li>
<li class="toctree-l3"><a class="reference internal" href="../acero/substrait.html">Using Acero with Substrait</a></li>
<li class="toctree-l3"><a class="reference internal" href="../acero/developer_guide.html">Developer’s Guide</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../io.html">Input / output and filesystems</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ipc.html">Reading and writing the Arrow IPC format</a></li>
<li class="toctree-l2"><a class="reference internal" href="../orc.html">Reading and Writing ORC files</a></li>
<li class="toctree-l2"><a class="reference internal" href="../parquet.html">Reading and writing Parquet files</a></li>
<li class="toctree-l2"><a class="reference internal" href="../csv.html">Reading and Writing CSV files</a></li>
<li class="toctree-l2"><a class="reference internal" href="../json.html">Reading JSON files</a></li>
<li class="toctree-l2"><a class="reference internal" href="../dataset.html">Tabular Datasets</a></li>
<li class="toctree-l2"><a class="reference internal" href="../flight.html">Arrow Flight RPC</a></li>
<li class="toctree-l2"><a class="reference internal" href="../gdb.html">Debugging code using Arrow</a></li>
<li class="toctree-l2"><a class="reference internal" href="../threading.html">Thread Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../opentelemetry.html">OpenTelemetry</a></li>
<li class="toctree-l2"><a class="reference internal" href="../env_vars.html">Environment Variables</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../examples/index.html">Examples</a><input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-5"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../examples/cmake_minimal_build.html">Minimal build using CMake</a></li>
<li class="toctree-l2"><a class="reference internal" href="../examples/compute_and_write_example.html">Compute and Write CSV Example</a></li>
<li class="toctree-l2"><a class="reference internal" href="../examples/dataset_documentation_example.html">Arrow Datasets example</a></li>
<li class="toctree-l2"><a class="reference internal" href="../examples/dataset_skyhook_scan_example.html">Arrow Skyhook example</a></li>
<li class="toctree-l2"><a class="reference internal" href="../examples/row_columnar_conversion.html">Row to columnar conversion</a></li>
<li class="toctree-l2"><a class="reference internal" href="../examples/tuple_range_conversion.html">std::tuple-like ranges to Arrow</a></li>
<li class="toctree-l2"><a class="reference internal" href="../examples/converting_recordbatch_to_tensor.html">Converting RecordBatch to Tensor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../api.html">API Reference</a><input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-6"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../api/support.html">Programming Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/memory.html">Memory (management)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/thread.html">Thread (management)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/datatype.html">Data Types</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/array.html">Arrays</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/scalar.html">Scalars</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/builder.html">Array Builders</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/table.html">Two-dimensional Datasets</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/c_abi.html">C Interfaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/compute.html">Compute Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/acero.html">Streaming Execution (Acero)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/gandiva.html">Gandiva Expression Compiler</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/tensor.html">Tensors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/utilities.html">Utilities</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/async.html">Asynchronous programming</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/io.html">Input / output</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/ipc.html">Arrow IPC</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/formats.html">File Formats</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/cuda.html">CUDA support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/flight.html">Arrow Flight RPC</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/flightsql.html">Arrow Flight SQL</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/filesystem.html">Filesystems</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/dataset.html">Dataset</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference external" href="https://arrow.apache.org/cookbook/cpp/">C++ cookbook</a></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">C++ Implementation</a></li>
<li class="breadcrumb-item"><a href="../getting_started.html" class="nav-link">Getting Started</a></li>
<li class="breadcrumb-item active" aria-current="page">Arrow Compute</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="arrow-compute">
<h1>Arrow Compute<a class="headerlink" href="#arrow-compute" title="Permalink to this heading">#</a></h1>
<p>Apache Arrow provides compute functions to facilitate efficient and
portable data processing. In this article, you will use Arrow’s compute
functionality to:</p>
<ol class="arabic simple">
<li><p>Calculate a sum over a column</p></li>
<li><p>Calculate element-wise sums over two columns</p></li>
<li><p>Search for a value in a column</p></li>
</ol>
<section id="pre-requisites">
<h2>Pre-requisites<a class="headerlink" href="#pre-requisites" title="Permalink to this heading">#</a></h2>
<p>Before continuing, make sure you have:</p>
<ol class="arabic simple">
<li><p>An Arrow installation, which you can set up here: <a class="reference internal" href="../build_system.html"><span class="doc">Using Arrow C++ in your own project</span></a></p></li>
<li><p>An understanding of basic Arrow data structures from <a class="reference internal" href="basic_arrow.html"><span class="doc">Basic Arrow Data Structures</span></a></p></li>
</ol>
</section>
<section id="setup">
<h2>Setup<a class="headerlink" href="#setup" title="Permalink to this heading">#</a></h2>
<p>Before running some computations, we need to fill in a couple gaps:</p>
<ol class="arabic simple">
<li><p>We need to include necessary headers.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">A</span> <span class="pre">main()</span></code> is needed to glue things together.</p></li>
<li><p>We need data to play with.</p></li>
</ol>
<section id="includes">
<h3>Includes<a class="headerlink" href="#includes" title="Permalink to this heading">#</a></h3>
<p>Before writing C++ code, we need some includes. We’ll get <code class="docutils literal notranslate"><span class="pre">iostream</span></code> for output, then import Arrow’s
compute functionality:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/api.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/compute/api.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
</pre></div>
</div>
</section>
<section id="main">
<h3>Main()<a class="headerlink" href="#main" title="Permalink to this heading">#</a></h3>
<p>For our glue, we’ll use the <code class="docutils literal notranslate"><span class="pre">main()</span></code> pattern from the previous tutorial on
data structures:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RunMain</span><span class="p">();</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">st</span><span class="p">.</span><span class="n">ok</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cerr</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Which, like when we used it before, is paired with a <code class="docutils literal notranslate"><span class="pre">RunMain()</span></code>:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="nf">RunMain</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
</pre></div>
</div>
</section>
<section id="generating-tables-for-computation">
<h3>Generating Tables for Computation<a class="headerlink" href="#generating-tables-for-computation" title="Permalink to this heading">#</a></h3>
<p>Before we begin, we’ll initialize a <a class="reference internal" href="../api/table.html#_CPPv4N5arrow5TableE" title="arrow::Table"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Table</span></code></a> with two columns to play with. We’ll use
the method from <a class="reference internal" href="basic_arrow.html"><span class="doc">Basic Arrow Data Structures</span></a>, so look back
there if anything’s confusing:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Create a couple 32-bit integer arrays.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int32Builder</span><span class="w"> </span><span class="n">int32builder</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int32_t</span><span class="w"> </span><span class="n">some_nums_raw</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">34</span><span class="p">,</span><span class="w"> </span><span class="mi">624</span><span class="p">,</span><span class="w"> </span><span class="mi">2223</span><span class="p">,</span><span class="w"> </span><span class="mi">5654</span><span class="p">,</span><span class="w"> </span><span class="mi">4356</span><span class="p">};</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int32builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">some_nums_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Array</span><span class="o">&gt;</span><span class="w"> </span><span class="n">some_nums</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">some_nums</span><span class="p">,</span><span class="w"> </span><span class="n">int32builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="w"> </span><span class="kt">int32_t</span><span class="w"> </span><span class="n">more_nums_raw</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">75342</span><span class="p">,</span><span class="w"> </span><span class="mi">23</span><span class="p">,</span><span class="w"> </span><span class="mi">64</span><span class="p">,</span><span class="w"> </span><span class="mi">17</span><span class="p">,</span><span class="w"> </span><span class="mi">736</span><span class="p">};</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int32builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">more_nums_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Array</span><span class="o">&gt;</span><span class="w"> </span><span class="n">more_nums</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">more_nums</span><span class="p">,</span><span class="w"> </span><span class="n">int32builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="w"> </span><span class="c1">// Make a table out of our pair of arrays.</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">&gt;</span><span class="w"> </span><span class="n">field_a</span><span class="p">,</span><span class="w"> </span><span class="n">field_b</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Schema</span><span class="o">&gt;</span><span class="w"> </span><span class="n">schema</span><span class="p">;</span>
<span class="w"> </span><span class="n">field_a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">field</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int32</span><span class="p">());</span>
<span class="w"> </span><span class="n">field_b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">field</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int32</span><span class="p">());</span>
<span class="w"> </span><span class="n">schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">schema</span><span class="p">({</span><span class="n">field_a</span><span class="p">,</span><span class="w"> </span><span class="n">field_b</span><span class="p">});</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Table</span><span class="o">&gt;</span><span class="w"> </span><span class="n">table</span><span class="p">;</span>
<span class="w"> </span><span class="n">table</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Table</span><span class="o">::</span><span class="n">Make</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="n">some_nums</span><span class="p">,</span><span class="w"> </span><span class="n">more_nums</span><span class="p">},</span><span class="w"> </span><span class="mi">5</span><span class="p">);</span>
</pre></div>
</div>
</section>
</section>
<section id="calculating-a-sum-over-an-array">
<h2>Calculating a Sum over an Array<a class="headerlink" href="#calculating-a-sum-over-an-array" title="Permalink to this heading">#</a></h2>
<p>Using a computation function has two general steps, which we separate
here:</p>
<ol class="arabic simple">
<li><p>Preparing a <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> for output</p></li>
<li><p>Calling <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::Sum()</span></code>, a convenience function for summation over an <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Array</span></code></a></p></li>
<li><p>Retrieving and printing output</p></li>
</ol>
<section id="prepare-memory-for-output-with-datum">
<h3>Prepare Memory for Output with Datum<a class="headerlink" href="#prepare-memory-for-output-with-datum" title="Permalink to this heading">#</a></h3>
<p>When computation is done, we need somewhere for our results to go. In
Arrow, the object for such output is called <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a>. This object is used
to pass around inputs and outputs in compute functions, and can contain
many differently-shaped Arrow data structures. We’ll need it to retrieve
the output from compute functions.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// The Datum class is what all compute functions output to, and they can take Datums</span>
<span class="w"> </span><span class="c1">// as inputs, as well.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Datum</span><span class="w"> </span><span class="n">sum</span><span class="p">;</span>
</pre></div>
</div>
</section>
<section id="call-sum">
<h3>Call Sum()<a class="headerlink" href="#call-sum" title="Permalink to this heading">#</a></h3>
<p>Here, we’ll get our <a class="reference internal" href="../api/table.html#_CPPv4N5arrow5TableE" title="arrow::Table"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Table</span></code></a>, which has columns “A” and “B”, and sum over
column “A.” For summation, there is a convenience function, called
<code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::Sum()</span></code>, which reduces the complexity of the compute interface. We’ll look
at the more complex version for the next computation. For a given
function, refer to <a class="reference internal" href="../api/compute.html"><span class="doc">Compute Functions</span></a> to see if there is a
convenience function. <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::Sum()</span></code> takes in a given <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Array</span></code></a> or <a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArray</span></code></a>
– here, we use <a class="reference internal" href="../api/table.html#_CPPv4NK5arrow5Table15GetColumnByNameERKNSt6stringE" title="arrow::Table::GetColumnByName"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">Table::GetColumnByName()</span></code></a> to pass in column A. Then, it outputs to
a <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a>. Putting that all together, we get this:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Here, we can use arrow::compute::Sum. This is a convenience function, and the next</span>
<span class="w"> </span><span class="c1">// computation won&#39;t be so simple. However, using these where possible helps</span>
<span class="w"> </span><span class="c1">// readability.</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">sum</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">Sum</span><span class="p">({</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">)}));</span>
</pre></div>
</div>
</section>
<section id="get-results-from-datum">
<h3>Get Results from Datum<a class="headerlink" href="#get-results-from-datum" title="Permalink to this heading">#</a></h3>
<p>The previous step leaves us with a <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> which contains our sum.
However, we cannot print it directly – its flexibility in holding
arbitrary Arrow data structures means we have to retrieve our data
carefully. First, to understand what’s in it, we can check which kind of
data structure it is, then what kind of primitive is being held:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Get the kind of Datum and what it holds -- this is a Scalar, with int64.</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Datum kind: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">sum</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span>
<span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; content type: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">sum</span><span class="p">.</span><span class="n">type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</pre></div>
</div>
<p>This should report the <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> stores a <a class="reference internal" href="../api/scalar.html#_CPPv4N5arrow6ScalarE" title="arrow::Scalar"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Scalar</span></code></a> with a 64-bit integer. Just
to see what the value is, we can print it out like so, which yields
12891:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Note that we explicitly request a scalar -- the Datum cannot simply give what it is,</span>
<span class="w"> </span><span class="c1">// you must ask for the correct type.</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">sum</span><span class="p">.</span><span class="n">scalar_as</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Scalar</span><span class="o">&gt;</span><span class="p">().</span><span class="n">value</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</pre></div>
</div>
<p>Now we’ve used <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::Sum()</span></code> and gotten what we want out of it!</p>
</section>
</section>
<section id="calculating-element-wise-array-addition-with-callfunction">
<h2>Calculating Element-Wise Array Addition with CallFunction()<a class="headerlink" href="#calculating-element-wise-array-addition-with-callfunction" title="Permalink to this heading">#</a></h2>
<p>A next layer of complexity uses what <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::Sum()</span></code> was helpfully hiding:
<code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code>. For this example, we will explore how to use the more
robust <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code> with the “add” compute function. The pattern
remains similar:</p>
<ol class="arabic simple">
<li><p>Preparing a Datum for output</p></li>
<li><p>Calling <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code> with “add”</p></li>
<li><p>Retrieving and printing output</p></li>
</ol>
<section id="id1">
<h3>Prepare Memory for Output with Datum<a class="headerlink" href="#id1" title="Permalink to this heading">#</a></h3>
<p>Once more, we’ll need a Datum for any output we get:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Datum</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">;</span>
</pre></div>
</div>
</section>
<section id="use-callfunction-with-add">
<h3>Use CallFunction() with “add”<a class="headerlink" href="#use-callfunction-with-add" title="Permalink to this heading">#</a></h3>
<p><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code> takes the name of the desired function as its first
argument, then the data inputs for said function as a vector in its
second argument. Right now, we want an element-wise addition between
columns “A” and “B”. So, we’ll ask for “add,” pass in columns “A and B”,
and output to our <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a>. Put this all together, and we get:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Get element-wise sum of both columns A and B in our Table. Note that here we use</span>
<span class="w"> </span><span class="c1">// CallFunction(), which takes the name of the function as the first argument.</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">element_wise_sum</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">CallFunction</span><span class="p">(</span>
<span class="w"> </span><span class="s">&quot;add&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">),</span>
<span class="w"> </span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">)}));</span>
</pre></div>
</div>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="../compute.html#compute-function-list"><span class="std std-ref">Available functions</span></a> for a list of other functions to go with <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code></p>
</div>
</section>
<section id="id2">
<h3>Get Results from Datum<a class="headerlink" href="#id2" title="Permalink to this heading">#</a></h3>
<p>Again, the <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> needs some careful handling. Said handling is much
easier when we know what’s in it. This <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> holds a <a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArray</span></code></a> with
32-bit integers, but we can print that to confirm:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Get the kind of Datum and what it holds -- this is a ChunkedArray, with int32.</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Datum kind: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span>
<span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; content type: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">.</span><span class="n">type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</pre></div>
</div>
<p>Since it’s a <a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArray</span></code></a>, we request that from the <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a><a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArray</span></code></a>
has a <a class="reference internal" href="../api/array.html#_CPPv4NK5arrow12ChunkedArray8ToStringEv" title="arrow::ChunkedArray::ToString"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">ChunkedArray::ToString()</span></code></a> method, so we’ll use that to print out its contents:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// This time, we get a ChunkedArray, not a scalar.</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">.</span><span class="n">chunked_array</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</pre></div>
</div>
<p>The output looks like this:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="n">Datum</span><span class="w"> </span><span class="n">kind</span><span class="o">:</span><span class="w"> </span><span class="n">ChunkedArray</span><span class="w"> </span><span class="n">content</span><span class="w"> </span><span class="n">type</span><span class="o">:</span><span class="w"> </span><span class="n">int32</span>
<span class="p">[</span>
<span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="mi">75376</span><span class="p">,</span>
<span class="w"> </span><span class="mi">647</span><span class="p">,</span>
<span class="w"> </span><span class="mi">2287</span><span class="p">,</span>
<span class="w"> </span><span class="mi">5671</span><span class="p">,</span>
<span class="w"> </span><span class="mi">5092</span>
<span class="w"> </span><span class="p">]</span>
<span class="p">]</span>
</pre></div>
</div>
<p>Now, we’ve used <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code>, instead of a convenience function! This
enables a much wider range of available computations.</p>
</section>
</section>
<section id="searching-for-a-value-with-callfunction-and-options">
<h2>Searching for a Value with CallFunction() and Options<a class="headerlink" href="#searching-for-a-value-with-callfunction-and-options" title="Permalink to this heading">#</a></h2>
<p>One class of computations remains. <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code> uses a vector for data
inputs, but computation often needs additional arguments to function. In
order to supply this, computation functions may be associated with
structs where their arguments can be defined. You can check a given
function to see which struct it uses <a class="reference internal" href="../compute.html#compute-function-list"><span class="std std-ref">here</span></a>. For this example, we’ll search for a value in column “A” using
the “index” compute function. This process has three steps, as opposed
to the two from before:</p>
<ol class="arabic simple">
<li><p>Preparing a <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> for output</p></li>
<li><p>Preparing <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow7compute12IndexOptionsE" title="arrow::compute::IndexOptions"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">compute::IndexOptions</span></code></a></p></li>
<li><p>Calling <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code> with “index” and <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow7compute12IndexOptionsE" title="arrow::compute::IndexOptions"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">compute::IndexOptions</span></code></a></p></li>
<li><p>Retrieving and printing output</p></li>
</ol>
<section id="id3">
<h3>Prepare Memory for Output with Datum<a class="headerlink" href="#id3" title="Permalink to this heading">#</a></h3>
<p>We’ll need a <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> for any output we get:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Use an options struct to set up searching for 2223 in column A (the third item).</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Datum</span><span class="w"> </span><span class="n">third_item</span><span class="p">;</span>
</pre></div>
</div>
</section>
<section id="configure-index-with-indexoptions">
<h3>Configure “index” with IndexOptions<a class="headerlink" href="#configure-index-with-indexoptions" title="Permalink to this heading">#</a></h3>
<p>For this exploration, we’ll use the “index” function – this is a
searching method, which returns the index of an input value. In order to
pass this input value, we require an <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow7compute12IndexOptionsE" title="arrow::compute::IndexOptions"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">compute::IndexOptions</span></code></a> struct. So, let’s make
that struct:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// An options struct is used in lieu of passing an arbitrary amount of arguments.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">IndexOptions</span><span class="w"> </span><span class="n">index_options</span><span class="p">;</span>
</pre></div>
</div>
<p>In a searching function, one requires a target value. Here, we’ll use
2223, the third item in column A, and configure our struct accordingly:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// We need an Arrow Scalar, not a raw value.</span>
<span class="w"> </span><span class="n">index_options</span><span class="p">.</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">MakeScalar</span><span class="p">(</span><span class="mi">2223</span><span class="p">);</span>
</pre></div>
</div>
</section>
<section id="use-callfunction-with-index-and-indexoptions">
<h3>Use CallFunction() with “index” and IndexOptions<a class="headerlink" href="#use-callfunction-with-index-and-indexoptions" title="Permalink to this heading">#</a></h3>
<p>To actually run the function, we use <code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">compute::CallFunction()</span></code> again, this time
passing our IndexOptions struct by reference as a third argument. As
before, the first argument is the name of the function, and the second
our data input:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span>
<span class="w"> </span><span class="n">third_item</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">CallFunction</span><span class="p">(</span><span class="s">&quot;index&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">)},</span>
<span class="w"> </span><span class="o">&amp;</span><span class="n">index_options</span><span class="p">));</span>
</pre></div>
</div>
</section>
<section id="id4">
<h3>Get Results from Datum<a class="headerlink" href="#id4" title="Permalink to this heading">#</a></h3>
<p>One last time, let’s see what our <a class="reference internal" href="../api/compute.html#_CPPv4N5arrow5DatumE" title="arrow::Datum"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Datum</span></code></a> has! This will be a <a class="reference internal" href="../api/scalar.html#_CPPv4N5arrow6ScalarE" title="arrow::Scalar"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Scalar</span></code></a> with
a 64-bit integer, and the output will be 2:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Get the kind of Datum and what it holds -- this is a Scalar, with int64</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Datum kind: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">third_item</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span>
<span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; content type: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">third_item</span><span class="p">.</span><span class="n">type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="c1">// We get a scalar -- the location of 2223 in column A, which is 2 in 0-based indexing.</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">third_item</span><span class="p">.</span><span class="n">scalar_as</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Scalar</span><span class="o">&gt;</span><span class="p">().</span><span class="n">value</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</pre></div>
</div>
</section>
</section>
<section id="ending-program">
<h2>Ending Program<a class="headerlink" href="#ending-program" title="Permalink to this heading">#</a></h2>
<p>At the end, we just return <a class="reference internal" href="../api/support.html#_CPPv4N5arrow6Status2OKEv" title="arrow::Status::OK"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">arrow::Status::OK()</span></code></a>, so the <code class="docutils literal notranslate"><span class="pre">main()</span></code> knows that
we’re done, and that everything’s okay, just like the preceding
tutorials.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="o">::</span><span class="n">OK</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
</div>
<p>With that, you’ve used compute functions which fall into the three main
types – with and without convenience functions, then with an Options
struct. Now you can process any <a class="reference internal" href="../api/table.html#_CPPv4N5arrow5TableE" title="arrow::Table"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Table</span></code></a> you need to, and solve whatever
data problem you have that fits into memory!</p>
<p>Which means that now we have to see how we can work with
larger-than-memory datasets, via Arrow Datasets in the next article.</p>
<p>Refer to the below for a copy of the complete code:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 19</span><span class="c1">// (Doc section: Includes)</span>
<span class="linenos"> 20</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/api.h&gt;</span>
<span class="linenos"> 21</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/compute/api.h&gt;</span>
<span class="linenos"> 22</span>
<span class="linenos"> 23</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
<span class="linenos"> 24</span><span class="c1">// (Doc section: Includes)</span>
<span class="linenos"> 25</span>
<span class="linenos"> 26</span><span class="c1">// (Doc section: RunMain)</span>
<span class="linenos"> 27</span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="nf">RunMain</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 28</span><span class="w"> </span><span class="c1">// (Doc section: RunMain)</span>
<span class="linenos"> 29</span><span class="w"> </span><span class="c1">// (Doc section: Create Tables)</span>
<span class="linenos"> 30</span><span class="w"> </span><span class="c1">// Create a couple 32-bit integer arrays.</span>
<span class="linenos"> 31</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int32Builder</span><span class="w"> </span><span class="n">int32builder</span><span class="p">;</span>
<span class="linenos"> 32</span><span class="w"> </span><span class="kt">int32_t</span><span class="w"> </span><span class="n">some_nums_raw</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">34</span><span class="p">,</span><span class="w"> </span><span class="mi">624</span><span class="p">,</span><span class="w"> </span><span class="mi">2223</span><span class="p">,</span><span class="w"> </span><span class="mi">5654</span><span class="p">,</span><span class="w"> </span><span class="mi">4356</span><span class="p">};</span>
<span class="linenos"> 33</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int32builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">some_nums_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="linenos"> 34</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Array</span><span class="o">&gt;</span><span class="w"> </span><span class="n">some_nums</span><span class="p">;</span>
<span class="linenos"> 35</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">some_nums</span><span class="p">,</span><span class="w"> </span><span class="n">int32builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos"> 36</span>
<span class="linenos"> 37</span><span class="w"> </span><span class="kt">int32_t</span><span class="w"> </span><span class="n">more_nums_raw</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">75342</span><span class="p">,</span><span class="w"> </span><span class="mi">23</span><span class="p">,</span><span class="w"> </span><span class="mi">64</span><span class="p">,</span><span class="w"> </span><span class="mi">17</span><span class="p">,</span><span class="w"> </span><span class="mi">736</span><span class="p">};</span>
<span class="linenos"> 38</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int32builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">more_nums_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="linenos"> 39</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Array</span><span class="o">&gt;</span><span class="w"> </span><span class="n">more_nums</span><span class="p">;</span>
<span class="linenos"> 40</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">more_nums</span><span class="p">,</span><span class="w"> </span><span class="n">int32builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos"> 41</span>
<span class="linenos"> 42</span><span class="w"> </span><span class="c1">// Make a table out of our pair of arrays.</span>
<span class="linenos"> 43</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">&gt;</span><span class="w"> </span><span class="n">field_a</span><span class="p">,</span><span class="w"> </span><span class="n">field_b</span><span class="p">;</span>
<span class="linenos"> 44</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Schema</span><span class="o">&gt;</span><span class="w"> </span><span class="n">schema</span><span class="p">;</span>
<span class="linenos"> 45</span>
<span class="linenos"> 46</span><span class="w"> </span><span class="n">field_a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">field</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int32</span><span class="p">());</span>
<span class="linenos"> 47</span><span class="w"> </span><span class="n">field_b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">field</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int32</span><span class="p">());</span>
<span class="linenos"> 48</span>
<span class="linenos"> 49</span><span class="w"> </span><span class="n">schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">schema</span><span class="p">({</span><span class="n">field_a</span><span class="p">,</span><span class="w"> </span><span class="n">field_b</span><span class="p">});</span>
<span class="linenos"> 50</span>
<span class="linenos"> 51</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Table</span><span class="o">&gt;</span><span class="w"> </span><span class="n">table</span><span class="p">;</span>
<span class="linenos"> 52</span><span class="w"> </span><span class="n">table</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Table</span><span class="o">::</span><span class="n">Make</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="n">some_nums</span><span class="p">,</span><span class="w"> </span><span class="n">more_nums</span><span class="p">},</span><span class="w"> </span><span class="mi">5</span><span class="p">);</span>
<span class="linenos"> 53</span><span class="w"> </span><span class="c1">// (Doc section: Create Tables)</span>
<span class="linenos"> 54</span>
<span class="linenos"> 55</span><span class="w"> </span><span class="c1">// (Doc section: Sum Datum Declaration)</span>
<span class="linenos"> 56</span><span class="w"> </span><span class="c1">// The Datum class is what all compute functions output to, and they can take Datums</span>
<span class="linenos"> 57</span><span class="w"> </span><span class="c1">// as inputs, as well.</span>
<span class="linenos"> 58</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Datum</span><span class="w"> </span><span class="n">sum</span><span class="p">;</span>
<span class="linenos"> 59</span><span class="w"> </span><span class="c1">// (Doc section: Sum Datum Declaration)</span>
<span class="linenos"> 60</span><span class="w"> </span><span class="c1">// (Doc section: Sum Call)</span>
<span class="linenos"> 61</span><span class="w"> </span><span class="c1">// Here, we can use arrow::compute::Sum. This is a convenience function, and the next</span>
<span class="linenos"> 62</span><span class="w"> </span><span class="c1">// computation won&#39;t be so simple. However, using these where possible helps</span>
<span class="linenos"> 63</span><span class="w"> </span><span class="c1">// readability.</span>
<span class="linenos"> 64</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">sum</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">Sum</span><span class="p">({</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">)}));</span>
<span class="linenos"> 65</span><span class="w"> </span><span class="c1">// (Doc section: Sum Call)</span>
<span class="linenos"> 66</span><span class="w"> </span><span class="c1">// (Doc section: Sum Datum Type)</span>
<span class="linenos"> 67</span><span class="w"> </span><span class="c1">// Get the kind of Datum and what it holds -- this is a Scalar, with int64.</span>
<span class="linenos"> 68</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Datum kind: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">sum</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span>
<span class="linenos"> 69</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; content type: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">sum</span><span class="p">.</span><span class="n">type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos"> 70</span><span class="w"> </span><span class="c1">// (Doc section: Sum Datum Type)</span>
<span class="linenos"> 71</span><span class="w"> </span><span class="c1">// (Doc section: Sum Contents)</span>
<span class="linenos"> 72</span><span class="w"> </span><span class="c1">// Note that we explicitly request a scalar -- the Datum cannot simply give what it is,</span>
<span class="linenos"> 73</span><span class="w"> </span><span class="c1">// you must ask for the correct type.</span>
<span class="linenos"> 74</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">sum</span><span class="p">.</span><span class="n">scalar_as</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Scalar</span><span class="o">&gt;</span><span class="p">().</span><span class="n">value</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos"> 75</span><span class="w"> </span><span class="c1">// (Doc section: Sum Contents)</span>
<span class="linenos"> 76</span>
<span class="linenos"> 77</span><span class="w"> </span><span class="c1">// (Doc section: Add Datum Declaration)</span>
<span class="linenos"> 78</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Datum</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">;</span>
<span class="linenos"> 79</span><span class="w"> </span><span class="c1">// (Doc section: Add Datum Declaration)</span>
<span class="linenos"> 80</span><span class="w"> </span><span class="c1">// (Doc section: Add Call)</span>
<span class="linenos"> 81</span><span class="w"> </span><span class="c1">// Get element-wise sum of both columns A and B in our Table. Note that here we use</span>
<span class="linenos"> 82</span><span class="w"> </span><span class="c1">// CallFunction(), which takes the name of the function as the first argument.</span>
<span class="linenos"> 83</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">element_wise_sum</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">CallFunction</span><span class="p">(</span>
<span class="linenos"> 84</span><span class="w"> </span><span class="s">&quot;add&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">),</span>
<span class="linenos"> 85</span><span class="w"> </span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">)}));</span>
<span class="linenos"> 86</span><span class="w"> </span><span class="c1">// (Doc section: Add Call)</span>
<span class="linenos"> 87</span><span class="w"> </span><span class="c1">// (Doc section: Add Datum Type)</span>
<span class="linenos"> 88</span><span class="w"> </span><span class="c1">// Get the kind of Datum and what it holds -- this is a ChunkedArray, with int32.</span>
<span class="linenos"> 89</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Datum kind: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span>
<span class="linenos"> 90</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; content type: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">.</span><span class="n">type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos"> 91</span><span class="w"> </span><span class="c1">// (Doc section: Add Datum Type)</span>
<span class="linenos"> 92</span><span class="w"> </span><span class="c1">// (Doc section: Add Contents)</span>
<span class="linenos"> 93</span><span class="w"> </span><span class="c1">// This time, we get a ChunkedArray, not a scalar.</span>
<span class="linenos"> 94</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">element_wise_sum</span><span class="p">.</span><span class="n">chunked_array</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos"> 95</span><span class="w"> </span><span class="c1">// (Doc section: Add Contents)</span>
<span class="linenos"> 96</span>
<span class="linenos"> 97</span><span class="w"> </span><span class="c1">// (Doc section: Index Datum Declare)</span>
<span class="linenos"> 98</span><span class="w"> </span><span class="c1">// Use an options struct to set up searching for 2223 in column A (the third item).</span>
<span class="linenos"> 99</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Datum</span><span class="w"> </span><span class="n">third_item</span><span class="p">;</span>
<span class="linenos">100</span><span class="w"> </span><span class="c1">// (Doc section: Index Datum Declare)</span>
<span class="linenos">101</span><span class="w"> </span><span class="c1">// (Doc section: IndexOptions Declare)</span>
<span class="linenos">102</span><span class="w"> </span><span class="c1">// An options struct is used in lieu of passing an arbitrary amount of arguments.</span>
<span class="linenos">103</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">IndexOptions</span><span class="w"> </span><span class="n">index_options</span><span class="p">;</span>
<span class="linenos">104</span><span class="w"> </span><span class="c1">// (Doc section: IndexOptions Declare)</span>
<span class="linenos">105</span><span class="w"> </span><span class="c1">// (Doc section: IndexOptions Assign)</span>
<span class="linenos">106</span><span class="w"> </span><span class="c1">// We need an Arrow Scalar, not a raw value.</span>
<span class="linenos">107</span><span class="w"> </span><span class="n">index_options</span><span class="p">.</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">MakeScalar</span><span class="p">(</span><span class="mi">2223</span><span class="p">);</span>
<span class="linenos">108</span><span class="w"> </span><span class="c1">// (Doc section: IndexOptions Assign)</span>
<span class="linenos">109</span><span class="w"> </span><span class="c1">// (Doc section: Index Call)</span>
<span class="linenos">110</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span>
<span class="linenos">111</span><span class="w"> </span><span class="n">third_item</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">compute</span><span class="o">::</span><span class="n">CallFunction</span><span class="p">(</span><span class="s">&quot;index&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">GetColumnByName</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">)},</span>
<span class="linenos">112</span><span class="w"> </span><span class="o">&amp;</span><span class="n">index_options</span><span class="p">));</span>
<span class="linenos">113</span><span class="w"> </span><span class="c1">// (Doc section: Index Call)</span>
<span class="linenos">114</span><span class="w"> </span><span class="c1">// (Doc section: Index Inspection)</span>
<span class="linenos">115</span><span class="w"> </span><span class="c1">// Get the kind of Datum and what it holds -- this is a Scalar, with int64</span>
<span class="linenos">116</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Datum kind: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">third_item</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span>
<span class="linenos">117</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; content type: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">third_item</span><span class="p">.</span><span class="n">type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">118</span><span class="w"> </span><span class="c1">// We get a scalar -- the location of 2223 in column A, which is 2 in 0-based indexing.</span>
<span class="linenos">119</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">third_item</span><span class="p">.</span><span class="n">scalar_as</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Scalar</span><span class="o">&gt;</span><span class="p">().</span><span class="n">value</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">120</span><span class="w"> </span><span class="c1">// (Doc section: Index Inspection)</span>
<span class="linenos">121</span><span class="w"> </span><span class="c1">// (Doc section: Ret)</span>
<span class="linenos">122</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="o">::</span><span class="n">OK</span><span class="p">();</span>
<span class="linenos">123</span><span class="p">}</span>
<span class="linenos">124</span><span class="c1">// (Doc section: Ret)</span>
<span class="linenos">125</span>
<span class="linenos">126</span><span class="c1">// (Doc section: Main)</span>
<span class="linenos">127</span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">128</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RunMain</span><span class="p">();</span>
<span class="linenos">129</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">st</span><span class="p">.</span><span class="n">ok</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">130</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cerr</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">131</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="linenos">132</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">133</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="linenos">134</span><span class="p">}</span>
<span class="linenos">135</span><span class="c1">// (Doc section: Main)</span>
</pre></div>
</div>
</section>
</section>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
<a class="left-prev"
href="io_tutorial.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
<p class="prev-next-title">Arrow File I/O</p>
</div>
</a>
<a class="right-next"
href="datasets_tutorial.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
<p class="prev-next-title">Arrow Datasets</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item">
<div
id="pst-page-navigation-heading-2"
class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> On this page
</div>
<nav class="bd-toc-nav page-toc" aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#pre-requisites">Pre-requisites</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#setup">Setup</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#includes">Includes</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#main">Main()</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#generating-tables-for-computation">Generating Tables for Computation</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#calculating-a-sum-over-an-array">Calculating a Sum over an Array</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#prepare-memory-for-output-with-datum">Prepare Memory for Output with Datum</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#call-sum">Call Sum()</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#get-results-from-datum">Get Results from Datum</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#calculating-element-wise-array-addition-with-callfunction">Calculating Element-Wise Array Addition with CallFunction()</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#id1">Prepare Memory for Output with Datum</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#use-callfunction-with-add">Use CallFunction() with “add”</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#id2">Get Results from Datum</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#searching-for-a-value-with-callfunction-and-options">Searching for a Value with CallFunction() and Options</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#id3">Prepare Memory for Output with Datum</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#configure-index-with-indexoptions">Configure “index” with IndexOptions</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#use-callfunction-with-index-and-indexoptions">Use CallFunction() with “index” and IndexOptions</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#id4">Get Results from Datum</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#ending-program">Ending Program</a></li>
</ul>
</nav></div>
<div class="sidebar-secondary-item">
<div class="tocsection editthispage">
<a href="https://github.com/apache/arrow/edit/main/docs/source/cpp/tutorials/compute_tutorial.rst">
<i class="fa-solid fa-pencil"></i>
Edit on GitHub
</a>
</div>
</div>
</div></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2016-2024 Apache Software Foundation.
Apache Arrow, Arrow, Apache, the Apache feather logo, and the Apache Arrow project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 6.2.0.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>