blob: 3bef91cca04ccf9d57313a19ecdc61f9ab06ade7 [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>Basic Arrow Data Structures &#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/basic_arrow';</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/basic_arrow.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 File I/O" href="io_tutorial.html" />
<link rel="prev" title="Conventions" href="../conventions.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 current active"><a class="current reference internal" href="#">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"><a class="reference internal" href="compute_tutorial.html">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">Basic Arrow...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="basic-arrow-data-structures">
<h1>Basic Arrow Data Structures<a class="headerlink" href="#basic-arrow-data-structures" title="Permalink to this heading">#</a></h1>
<p>Apache Arrow provides fundamental data structures for representing data:
<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>, <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>, <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>, and <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>.
This article shows how to construct these data structures from primitive
data types; specifically, we will work with integers of varying size
representing days, months, and years. We will use them to create the following data structures:</p>
<ol class="arabic simple">
<li><p>Arrow <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a></p></li>
<li><p><a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArrays</span></code></a></p></li>
<li><p><a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>, from <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a></p></li>
<li><p><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>, from <a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArrays</span></code></a></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>Understanding of how to use basic C++ data structures</p></li>
<li><p>Understanding of basic C++ data types</p></li>
</ol>
</section>
<section id="setup">
<h2>Setup<a class="headerlink" href="#setup" title="Permalink to this heading">#</a></h2>
<p>Before trying out Arrow, 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>
</ol>
<section id="includes">
<h3>Includes<a class="headerlink" href="#includes" title="Permalink to this heading">#</a></h3>
<p>First, as ever, we need some includes. We’ll get <code class="docutils literal notranslate"><span class="pre">iostream</span></code> for output, then import Arrow’s basic
functionality from <code class="docutils literal notranslate"><span class="pre">api.h</span></code>, like so:</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;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>Next, we need a <code class="docutils literal notranslate"><span class="pre">main()</span></code> – a common pattern with Arrow looks like the
following:</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>This allows us to easily use Arrow’s error-handling macros, which will
return back to <code class="docutils literal notranslate"><span class="pre">main()</span></code> with a <a class="reference internal" href="../api/support.html#_CPPv4N5arrow6StatusE" title="arrow::Status"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::Status</span></code></a> object if a failure occurs – and
this <code class="docutils literal notranslate"><span class="pre">main()</span></code> will report the error. Note that this means Arrow never
raises exceptions, instead relying upon returning <a class="reference internal" href="../api/support.html#_CPPv4N5arrow6StatusE" title="arrow::Status"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Status</span></code></a>. For more on
that, read here: <a class="reference internal" href="../conventions.html"><span class="doc">Conventions</span></a>.</p>
<p>To accompany this <code class="docutils literal notranslate"><span class="pre">main()</span></code>, we have a <code class="docutils literal notranslate"><span class="pre">RunMain()</span></code> from which any <a class="reference internal" href="../api/support.html#_CPPv4N5arrow6StatusE" title="arrow::Status"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Status</span></code></a>
objects can return – this is where we’ll write the rest of the program:</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>
<section id="making-an-arrow-array">
<h2>Making an Arrow Array<a class="headerlink" href="#making-an-arrow-array" title="Permalink to this heading">#</a></h2>
<section id="building-int8-arrays">
<h3>Building int8 Arrays<a class="headerlink" href="#building-int8-arrays" title="Permalink to this heading">#</a></h3>
<p>Given that we have some data in standard C++ arrays, and want to use Arrow, we need to move
the data from said arrays into Arrow arrays. We still guarantee contiguity of memory in 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>, so no worries about a performance loss when using <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> vs C++ arrays.
The easiest way to construct 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> uses an <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayBuilder</span></code></a>.</p>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference internal" href="../arrays.html"><span class="doc">Arrays</span></a> for more technical details on <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>
</div>
<p>The following code initializes an <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayBuilder</span></code></a> for 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> that will hold 8 bit
integers. Specifically, it uses the <code class="docutils literal notranslate"><span class="pre">AppendValues()</span></code> method, present in concrete
<a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::ArrayBuilder</span></code></a> subclasses, to fill the <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayBuilder</span></code></a> with the
contents of a standard C++ array. Note the use of <a class="reference internal" href="../api/support.html#c.ARROW_RETURN_NOT_OK" title="ARROW_RETURN_NOT_OK"><code class="xref c c-macro docutils literal notranslate"><span class="pre">ARROW_RETURN_NOT_OK</span></code></a>.
If <code class="docutils literal notranslate"><span class="pre">AppendValues()</span></code> fails, this macro will return to <code class="docutils literal notranslate"><span class="pre">main()</span></code>, which will
print out the meaning of the failure.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Builders are the main way to create Arrays in Arrow from existing values that are not</span>
<span class="w"> </span><span class="c1">// on-disk. In this case, we&#39;ll make a simple array, and feed that in.</span>
<span class="w"> </span><span class="c1">// Data types are important as ever, and there is a Builder for each compatible type;</span>
<span class="w"> </span><span class="c1">// in this case, int8.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int8Builder</span><span class="w"> </span><span class="n">int8builder</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">days_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">1</span><span class="p">,</span><span class="w"> </span><span class="mi">12</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">23</span><span class="p">,</span><span class="w"> </span><span class="mi">28</span><span class="p">};</span>
<span class="w"> </span><span class="c1">// AppendValues, as called, puts 5 values from days_raw into our Builder object.</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">days_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
</pre></div>
</div>
<p>Given an <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayBuilder</span></code></a> has the values we want in our <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>, we can use
<a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilder6FinishEPNSt10shared_ptrI5ArrayEE" title="arrow::ArrayBuilder::Finish"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">ArrayBuilder::Finish()</span></code></a> to output the final structure to 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> – specifically,
we output to a <code class="docutils literal notranslate"><span class="pre">std::shared_ptr&lt;arrow::Array&gt;</span></code>. Note the use of <a class="reference internal" href="../api/support.html#c.ARROW_ASSIGN_OR_RAISE" title="ARROW_ASSIGN_OR_RAISE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">ARROW_ASSIGN_OR_RAISE</span></code></a>
in the following code. <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilder6FinishEPNSt10shared_ptrI5ArrayEE" title="arrow::ArrayBuilder::Finish"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">Finish()</span></code></a> outputs a <a class="reference internal" href="../api/support.html#_CPPv4I0EN5arrow6ResultE" title="arrow::Result"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::Result</span></code></a> object, which <a class="reference internal" href="../api/support.html#c.ARROW_ASSIGN_OR_RAISE" title="ARROW_ASSIGN_OR_RAISE"><code class="xref c c-macro docutils literal notranslate"><span class="pre">ARROW_ASSIGN_OR_RAISE</span></code></a>
can process. If the method fails, it will return to <code class="docutils literal notranslate"><span class="pre">main()</span></code> with a <a class="reference internal" href="../api/support.html#_CPPv4N5arrow6StatusE" title="arrow::Status"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Status</span></code></a>
that will explain what went wrong. If it succeeds, then it will assign
the final output to the left-hand variable.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// We only have a Builder though, not an Array -- the following code pushes out the</span>
<span class="w"> </span><span class="c1">// built up data into a proper Array.</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">days</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
</pre></div>
</div>
<p>As soon as <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayBuilder</span></code></a> has had its <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilder6FinishEPNSt10shared_ptrI5ArrayEE" title="arrow::ArrayBuilder::Finish"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">Finish</span></code></a> method called, its state resets, so
it can be used again, as if it was fresh. Thus, we repeat the process above for our second array:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Builders clear their state every time they fill an Array, so if the type is the same,</span>
<span class="w"> </span><span class="c1">// we can re-use the builder. We do that here for month values.</span>
<span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">months_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">1</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">};</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">months_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">months</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">months</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
</pre></div>
</div>
</section>
<section id="building-int16-arrays">
<h3>Building int16 Arrays<a class="headerlink" href="#building-int16-arrays" title="Permalink to this heading">#</a></h3>
<p>An <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayBuilder</span></code></a> has its type specified at the time of declaration.
Once this is done, it cannot have its type changed. We have to make a new one when we switch to year data, which
requires a 16-bit integer at the minimum. Of course, there’s an <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow12ArrayBuilderE" title="arrow::ArrayBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayBuilder</span></code></a> for that.
It uses the exact same methods, but with the new data type:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Now that we change to int16, we use the Builder for that data type instead.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int16Builder</span><span class="w"> </span><span class="n">int16builder</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int16_t</span><span class="w"> </span><span class="n">years_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">1990</span><span class="p">,</span><span class="w"> </span><span class="mi">2000</span><span class="p">,</span><span class="w"> </span><span class="mi">1995</span><span class="p">,</span><span class="w"> </span><span class="mi">2000</span><span class="p">,</span><span class="w"> </span><span class="mi">1995</span><span class="p">};</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int16builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">years_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">years</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">years</span><span class="p">,</span><span class="w"> </span><span class="n">int16builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
</pre></div>
</div>
<p>Now, we have three Arrow <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a>, with some variance in type.</p>
</section>
</section>
<section id="making-a-recordbatch">
<h2>Making a RecordBatch<a class="headerlink" href="#making-a-recordbatch" title="Permalink to this heading">#</a></h2>
<p>A columnar data format only really comes into play when you have a table.
So, let’s make one. The first kind we’ll make is the <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a> – this
uses <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a> internally, which means all data will be contiguous within each
column, but any appending or concatenating will require copying. Making a <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>
has two steps, given existing <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a>:</p>
<ol class="arabic simple">
<li><p>Defining a <a class="reference internal" href="../api/datatype.html#_CPPv4N5arrow6SchemaE" title="arrow::Schema"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Schema</span></code></a></p></li>
<li><p>Loading the <a class="reference internal" href="../api/datatype.html#_CPPv4N5arrow6SchemaE" title="arrow::Schema"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Schema</span></code></a> and Arrays into the constructor</p></li>
</ol>
<section id="defining-a-schema">
<h3>Defining a Schema<a class="headerlink" href="#defining-a-schema" title="Permalink to this heading">#</a></h3>
<p>To get started making a <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>, we first need to define
characteristics of the columns, each represented by a <a class="reference internal" href="../api/datatype.html#_CPPv4N5arrow5FieldE" title="arrow::Field"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Field</span></code></a> instance.
Each <a class="reference internal" href="../api/datatype.html#_CPPv4N5arrow5FieldE" title="arrow::Field"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Field</span></code></a> contains a name and datatype for its associated column; then,
a <a class="reference internal" href="../api/datatype.html#_CPPv4N5arrow6SchemaE" title="arrow::Schema"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Schema</span></code></a> groups them together and sets the order of the columns, like
so:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Now, we want a RecordBatch, which has columns and labels for said columns.</span>
<span class="w"> </span><span class="c1">// This gets us to the 2d data structures we want in Arrow.</span>
<span class="w"> </span><span class="c1">// These are defined by schema, which have fields -- here we get both those object types</span>
<span class="w"> </span><span class="c1">// ready.</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_day</span><span class="p">,</span><span class="w"> </span><span class="n">field_month</span><span class="p">,</span><span class="w"> </span><span class="n">field_year</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="c1">// Every field needs its name and data type.</span>
<span class="w"> </span><span class="n">field_day</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;Day&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int8</span><span class="p">());</span>
<span class="w"> </span><span class="n">field_month</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;Month&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int8</span><span class="p">());</span>
<span class="w"> </span><span class="n">field_year</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;Year&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int16</span><span class="p">());</span>
<span class="w"> </span><span class="c1">// The schema can be built from a vector of fields, and we do so here.</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_day</span><span class="p">,</span><span class="w"> </span><span class="n">field_month</span><span class="p">,</span><span class="w"> </span><span class="n">field_year</span><span class="p">});</span>
</pre></div>
</div>
</section>
<section id="building-a-recordbatch">
<h3>Building a RecordBatch<a class="headerlink" href="#building-a-recordbatch" title="Permalink to this heading">#</a></h3>
<p>With data in <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a> from the previous section, and column descriptions in our
<a class="reference internal" href="../api/datatype.html#_CPPv4N5arrow6SchemaE" title="arrow::Schema"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Schema</span></code></a> from the previous step, we can make the <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>. Note that the
length of the columns is necessary, and the length is shared by all columns.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// With the schema and Arrays full of data, we can make our RecordBatch! Here,</span>
<span class="w"> </span><span class="c1">// each column is internally contiguous. This is in opposition to Tables, which we&#39;ll</span>
<span class="w"> </span><span class="c1">// see next.</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">RecordBatch</span><span class="o">&gt;</span><span class="w"> </span><span class="n">rbatch</span><span class="p">;</span>
<span class="w"> </span><span class="c1">// The RecordBatch needs the schema, length for columns, which all must match,</span>
<span class="w"> </span><span class="c1">// and the actual data itself.</span>
<span class="w"> </span><span class="n">rbatch</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">RecordBatch</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="n">days</span><span class="o">-&gt;</span><span class="n">length</span><span class="p">(),</span><span class="w"> </span><span class="p">{</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">months</span><span class="p">,</span><span class="w"> </span><span class="n">years</span><span class="p">});</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">rbatch</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">();</span>
</pre></div>
</div>
<p>Now, we have our data in a nice tabular form, safely within the <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>.
What we can do with this will be discussed in the later tutorials.</p>
</section>
</section>
<section id="making-a-chunkedarray">
<h2>Making a ChunkedArray<a class="headerlink" href="#making-a-chunkedarray" title="Permalink to this heading">#</a></h2>
<p>Let’s say that we want an array made up of sub-arrays, because it
can be useful for avoiding data copies when concatenating, for parallelizing work, for fitting each chunk
into cache, or for exceeding the 2,147,483,647 row limit in a
standard Arrow <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>. For this, Arrow offers <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>, which can be
made up of individual Arrow <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a>. In this example, we can reuse the arrays
we made earlier in part of our chunked array, allowing us to extend them without having to copy
data. So, let’s build a few more <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a>,
using the same builders for ease of use:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Now, let&#39;s get some new arrays! It&#39;ll be the same datatypes as above, so we re-use</span>
<span class="w"> </span><span class="c1">// Builders.</span>
<span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">days_raw2</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">6</span><span class="p">,</span><span class="w"> </span><span class="mi">12</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="mi">22</span><span class="p">};</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">days_raw2</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">days2</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">days2</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">months_raw2</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">5</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">11</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">};</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">months_raw2</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">months2</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">months2</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="w"> </span><span class="kt">int16_t</span><span class="w"> </span><span class="n">years_raw2</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">1980</span><span class="p">,</span><span class="w"> </span><span class="mi">2001</span><span class="p">,</span><span class="w"> </span><span class="mi">1915</span><span class="p">,</span><span class="w"> </span><span class="mi">2020</span><span class="p">,</span><span class="w"> </span><span class="mi">1996</span><span class="p">};</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int16builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">years_raw2</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">years2</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">years2</span><span class="p">,</span><span class="w"> </span><span class="n">int16builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
</pre></div>
</div>
<p>In order to support an arbitrary amount of <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a> in the construction of the
<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>, Arrow supplies <code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ArrayVector</span></code>. This provides a vector for <a class="reference internal" href="../api/array.html#_CPPv4N5arrow5ArrayE" title="arrow::Array"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Arrays</span></code></a>,
and we’ll use it here to prepare to make 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>:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// ChunkedArrays let us have a list of arrays, which aren&#39;t contiguous</span>
<span class="w"> </span><span class="c1">// with each other. First, we get a vector of arrays.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayVector</span><span class="w"> </span><span class="n">day_vecs</span><span class="p">{</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">days2</span><span class="p">};</span>
</pre></div>
</div>
<p>In order to leverage Arrow, we do need to take that last step, and move into 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>:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Then, we use that to initialize a ChunkedArray, which can be used with other</span>
<span class="w"> </span><span class="c1">// functions in Arrow! This is good, since having a normal vector of arrays wouldn&#39;t</span>
<span class="w"> </span><span class="c1">// get us far.</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">ChunkedArray</span><span class="o">&gt;</span><span class="w"> </span><span class="n">day_chunks</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ChunkedArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">day_vecs</span><span class="p">);</span>
</pre></div>
</div>
<p>With 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> for our day values, we now just need to repeat the process
for the month and year data:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// Repeat for months.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayVector</span><span class="w"> </span><span class="n">month_vecs</span><span class="p">{</span><span class="n">months</span><span class="p">,</span><span class="w"> </span><span class="n">months2</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">ChunkedArray</span><span class="o">&gt;</span><span class="w"> </span><span class="n">month_chunks</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ChunkedArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">month_vecs</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// Repeat for years.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayVector</span><span class="w"> </span><span class="n">year_vecs</span><span class="p">{</span><span class="n">years</span><span class="p">,</span><span class="w"> </span><span class="n">years2</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">ChunkedArray</span><span class="o">&gt;</span><span class="w"> </span><span class="n">year_chunks</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ChunkedArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">year_vecs</span><span class="p">);</span>
</pre></div>
</div>
<p>With that, we are left with three <a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArrays</span></code></a>, varying in type.</p>
</section>
<section id="making-a-table">
<h2>Making a Table<a class="headerlink" href="#making-a-table" title="Permalink to this heading">#</a></h2>
<p>One particularly useful thing we can do with the <a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArrays</span></code></a> from the previous section is creating
<a class="reference internal" href="../api/table.html#_CPPv4N5arrow5TableE" title="arrow::Table"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Tables</span></code></a>. Much like a <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>, 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> stores tabular data. However, 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> does not guarantee contiguity, due to being made up of <a class="reference internal" href="../api/array.html#_CPPv4N5arrow12ChunkedArrayE" title="arrow::ChunkedArray"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">ChunkedArrays</span></code></a>.
This can be useful for logic, parallelizing work, for fitting chunks into cache, or exceeding the 2,147,483,647 row limit
present in <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> and, thus, <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>.</p>
<p>If you read up to <a class="reference internal" href="../api/table.html#_CPPv4N5arrow11RecordBatchE" title="arrow::RecordBatch"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">RecordBatch</span></code></a>, you may note that the <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> constructor in the following code is
effectively identical, it just happens to put the length of the columns
in position 3, and makes 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>. We re-use the <a class="reference internal" href="../api/datatype.html#_CPPv4N5arrow6SchemaE" title="arrow::Schema"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">Schema</span></code></a> from before, and
make 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>:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// A Table is the structure we need for these non-contiguous columns, and keeps them</span>
<span class="w"> </span><span class="c1">// all in one place for us so we can use them as if they were normal 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">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">day_chunks</span><span class="p">,</span><span class="w"> </span><span class="n">month_chunks</span><span class="p">,</span><span class="w"> </span><span class="n">year_chunks</span><span class="p">},</span><span class="w"> </span><span class="mi">10</span><span class="p">);</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">table</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">();</span>
</pre></div>
</div>
<p>Now, we have our data in a nice tabular form, safely within the <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>.
What we can do with this will be discussed in the later tutorials.</p>
</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">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.</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>
</section>
<section id="wrapping-up">
<h2>Wrapping Up<a class="headerlink" href="#wrapping-up" title="Permalink to this heading">#</a></h2>
<p>With that, you’ve created the fundamental data structures in Arrow, and
can proceed to getting them in and out of a program with file I/O 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="linenos"> 22</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
<span class="linenos"> 23</span><span class="c1">// (Doc section: Includes)</span>
<span class="linenos"> 24</span>
<span class="linenos"> 25</span><span class="c1">// (Doc section: RunMain Start)</span>
<span class="linenos"> 26</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"> 27</span><span class="w"> </span><span class="c1">// (Doc section: RunMain Start)</span>
<span class="linenos"> 28</span><span class="w"> </span><span class="c1">// (Doc section: int8builder 1 Append)</span>
<span class="linenos"> 29</span><span class="w"> </span><span class="c1">// Builders are the main way to create Arrays in Arrow from existing values that are not</span>
<span class="linenos"> 30</span><span class="w"> </span><span class="c1">// on-disk. In this case, we&#39;ll make a simple array, and feed that in.</span>
<span class="linenos"> 31</span><span class="w"> </span><span class="c1">// Data types are important as ever, and there is a Builder for each compatible type;</span>
<span class="linenos"> 32</span><span class="w"> </span><span class="c1">// in this case, int8.</span>
<span class="linenos"> 33</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int8Builder</span><span class="w"> </span><span class="n">int8builder</span><span class="p">;</span>
<span class="linenos"> 34</span><span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">days_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">1</span><span class="p">,</span><span class="w"> </span><span class="mi">12</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">23</span><span class="p">,</span><span class="w"> </span><span class="mi">28</span><span class="p">};</span>
<span class="linenos"> 35</span><span class="w"> </span><span class="c1">// AppendValues, as called, puts 5 values from days_raw into our Builder object.</span>
<span class="linenos"> 36</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">days_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="linenos"> 37</span><span class="w"> </span><span class="c1">// (Doc section: int8builder 1 Append)</span>
<span class="linenos"> 38</span>
<span class="linenos"> 39</span><span class="w"> </span><span class="c1">// (Doc section: int8builder 1 Finish)</span>
<span class="linenos"> 40</span><span class="w"> </span><span class="c1">// We only have a Builder though, not an Array -- the following code pushes out the</span>
<span class="linenos"> 41</span><span class="w"> </span><span class="c1">// built up data into a proper Array.</span>
<span class="linenos"> 42</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">days</span><span class="p">;</span>
<span class="linenos"> 43</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos"> 44</span><span class="w"> </span><span class="c1">// (Doc section: int8builder 1 Finish)</span>
<span class="linenos"> 45</span>
<span class="linenos"> 46</span><span class="w"> </span><span class="c1">// (Doc section: int8builder 2)</span>
<span class="linenos"> 47</span><span class="w"> </span><span class="c1">// Builders clear their state every time they fill an Array, so if the type is the same,</span>
<span class="linenos"> 48</span><span class="w"> </span><span class="c1">// we can re-use the builder. We do that here for month values.</span>
<span class="linenos"> 49</span><span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">months_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">1</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">};</span>
<span class="linenos"> 50</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">months_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</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">Array</span><span class="o">&gt;</span><span class="w"> </span><span class="n">months</span><span class="p">;</span>
<span class="linenos"> 52</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">months</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos"> 53</span><span class="w"> </span><span class="c1">// (Doc section: int8builder 2)</span>
<span class="linenos"> 54</span>
<span class="linenos"> 55</span><span class="w"> </span><span class="c1">// (Doc section: int16builder)</span>
<span class="linenos"> 56</span><span class="w"> </span><span class="c1">// Now that we change to int16, we use the Builder for that data type instead.</span>
<span class="linenos"> 57</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int16Builder</span><span class="w"> </span><span class="n">int16builder</span><span class="p">;</span>
<span class="linenos"> 58</span><span class="w"> </span><span class="kt">int16_t</span><span class="w"> </span><span class="n">years_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">1990</span><span class="p">,</span><span class="w"> </span><span class="mi">2000</span><span class="p">,</span><span class="w"> </span><span class="mi">1995</span><span class="p">,</span><span class="w"> </span><span class="mi">2000</span><span class="p">,</span><span class="w"> </span><span class="mi">1995</span><span class="p">};</span>
<span class="linenos"> 59</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int16builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">years_raw</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="linenos"> 60</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">years</span><span class="p">;</span>
<span class="linenos"> 61</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">years</span><span class="p">,</span><span class="w"> </span><span class="n">int16builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos"> 62</span><span class="w"> </span><span class="c1">// (Doc section: int16builder)</span>
<span class="linenos"> 63</span>
<span class="linenos"> 64</span><span class="w"> </span><span class="c1">// (Doc section: Schema)</span>
<span class="linenos"> 65</span><span class="w"> </span><span class="c1">// Now, we want a RecordBatch, which has columns and labels for said columns.</span>
<span class="linenos"> 66</span><span class="w"> </span><span class="c1">// This gets us to the 2d data structures we want in Arrow.</span>
<span class="linenos"> 67</span><span class="w"> </span><span class="c1">// These are defined by schema, which have fields -- here we get both those object types</span>
<span class="linenos"> 68</span><span class="w"> </span><span class="c1">// ready.</span>
<span class="linenos"> 69</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_day</span><span class="p">,</span><span class="w"> </span><span class="n">field_month</span><span class="p">,</span><span class="w"> </span><span class="n">field_year</span><span class="p">;</span>
<span class="linenos"> 70</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"> 71</span>
<span class="linenos"> 72</span><span class="w"> </span><span class="c1">// Every field needs its name and data type.</span>
<span class="linenos"> 73</span><span class="w"> </span><span class="n">field_day</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;Day&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int8</span><span class="p">());</span>
<span class="linenos"> 74</span><span class="w"> </span><span class="n">field_month</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;Month&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int8</span><span class="p">());</span>
<span class="linenos"> 75</span><span class="w"> </span><span class="n">field_year</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;Year&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int16</span><span class="p">());</span>
<span class="linenos"> 76</span>
<span class="linenos"> 77</span><span class="w"> </span><span class="c1">// The schema can be built from a vector of fields, and we do so here.</span>
<span class="linenos"> 78</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_day</span><span class="p">,</span><span class="w"> </span><span class="n">field_month</span><span class="p">,</span><span class="w"> </span><span class="n">field_year</span><span class="p">});</span>
<span class="linenos"> 79</span><span class="w"> </span><span class="c1">// (Doc section: Schema)</span>
<span class="linenos"> 80</span>
<span class="linenos"> 81</span><span class="w"> </span><span class="c1">// (Doc section: RBatch)</span>
<span class="linenos"> 82</span><span class="w"> </span><span class="c1">// With the schema and Arrays full of data, we can make our RecordBatch! Here,</span>
<span class="linenos"> 83</span><span class="w"> </span><span class="c1">// each column is internally contiguous. This is in opposition to Tables, which we&#39;ll</span>
<span class="linenos"> 84</span><span class="w"> </span><span class="c1">// see next.</span>
<span class="linenos"> 85</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">RecordBatch</span><span class="o">&gt;</span><span class="w"> </span><span class="n">rbatch</span><span class="p">;</span>
<span class="linenos"> 86</span><span class="w"> </span><span class="c1">// The RecordBatch needs the schema, length for columns, which all must match,</span>
<span class="linenos"> 87</span><span class="w"> </span><span class="c1">// and the actual data itself.</span>
<span class="linenos"> 88</span><span class="w"> </span><span class="n">rbatch</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">RecordBatch</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="n">days</span><span class="o">-&gt;</span><span class="n">length</span><span class="p">(),</span><span class="w"> </span><span class="p">{</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">months</span><span class="p">,</span><span class="w"> </span><span class="n">years</span><span class="p">});</span>
<span class="linenos"> 89</span>
<span class="linenos"> 90</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">rbatch</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">();</span>
<span class="linenos"> 91</span><span class="w"> </span><span class="c1">// (Doc section: RBatch)</span>
<span class="linenos"> 92</span>
<span class="linenos"> 93</span><span class="w"> </span><span class="c1">// (Doc section: More Arrays)</span>
<span class="linenos"> 94</span><span class="w"> </span><span class="c1">// Now, let&#39;s get some new arrays! It&#39;ll be the same datatypes as above, so we re-use</span>
<span class="linenos"> 95</span><span class="w"> </span><span class="c1">// Builders.</span>
<span class="linenos"> 96</span><span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">days_raw2</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">6</span><span class="p">,</span><span class="w"> </span><span class="mi">12</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w"> </span><span class="mi">22</span><span class="p">};</span>
<span class="linenos"> 97</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">days_raw2</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="linenos"> 98</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">days2</span><span class="p">;</span>
<span class="linenos"> 99</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">days2</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos">100</span>
<span class="linenos">101</span><span class="w"> </span><span class="kt">int8_t</span><span class="w"> </span><span class="n">months_raw2</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">5</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">11</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">};</span>
<span class="linenos">102</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int8builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">months_raw2</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="linenos">103</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">months2</span><span class="p">;</span>
<span class="linenos">104</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">months2</span><span class="p">,</span><span class="w"> </span><span class="n">int8builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos">105</span>
<span class="linenos">106</span><span class="w"> </span><span class="kt">int16_t</span><span class="w"> </span><span class="n">years_raw2</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">1980</span><span class="p">,</span><span class="w"> </span><span class="mi">2001</span><span class="p">,</span><span class="w"> </span><span class="mi">1915</span><span class="p">,</span><span class="w"> </span><span class="mi">2020</span><span class="p">,</span><span class="w"> </span><span class="mi">1996</span><span class="p">};</span>
<span class="linenos">107</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">int16builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">years_raw2</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">));</span>
<span class="linenos">108</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">years2</span><span class="p">;</span>
<span class="linenos">109</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">years2</span><span class="p">,</span><span class="w"> </span><span class="n">int16builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="linenos">110</span><span class="w"> </span><span class="c1">// (Doc section: More Arrays)</span>
<span class="linenos">111</span>
<span class="linenos">112</span><span class="w"> </span><span class="c1">// (Doc section: ArrayVector)</span>
<span class="linenos">113</span><span class="w"> </span><span class="c1">// ChunkedArrays let us have a list of arrays, which aren&#39;t contiguous</span>
<span class="linenos">114</span><span class="w"> </span><span class="c1">// with each other. First, we get a vector of arrays.</span>
<span class="linenos">115</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayVector</span><span class="w"> </span><span class="n">day_vecs</span><span class="p">{</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">days2</span><span class="p">};</span>
<span class="linenos">116</span><span class="w"> </span><span class="c1">// (Doc section: ArrayVector)</span>
<span class="linenos">117</span><span class="w"> </span><span class="c1">// (Doc section: ChunkedArray Day)</span>
<span class="linenos">118</span><span class="w"> </span><span class="c1">// Then, we use that to initialize a ChunkedArray, which can be used with other</span>
<span class="linenos">119</span><span class="w"> </span><span class="c1">// functions in Arrow! This is good, since having a normal vector of arrays wouldn&#39;t</span>
<span class="linenos">120</span><span class="w"> </span><span class="c1">// get us far.</span>
<span class="linenos">121</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">ChunkedArray</span><span class="o">&gt;</span><span class="w"> </span><span class="n">day_chunks</span><span class="w"> </span><span class="o">=</span>
<span class="linenos">122</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ChunkedArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">day_vecs</span><span class="p">);</span>
<span class="linenos">123</span><span class="w"> </span><span class="c1">// (Doc section: ChunkedArray Day)</span>
<span class="linenos">124</span>
<span class="linenos">125</span><span class="w"> </span><span class="c1">// (Doc section: ChunkedArray Month Year)</span>
<span class="linenos">126</span><span class="w"> </span><span class="c1">// Repeat for months.</span>
<span class="linenos">127</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayVector</span><span class="w"> </span><span class="n">month_vecs</span><span class="p">{</span><span class="n">months</span><span class="p">,</span><span class="w"> </span><span class="n">months2</span><span class="p">};</span>
<span class="linenos">128</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">ChunkedArray</span><span class="o">&gt;</span><span class="w"> </span><span class="n">month_chunks</span><span class="w"> </span><span class="o">=</span>
<span class="linenos">129</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ChunkedArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">month_vecs</span><span class="p">);</span>
<span class="linenos">130</span>
<span class="linenos">131</span><span class="w"> </span><span class="c1">// Repeat for years.</span>
<span class="linenos">132</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayVector</span><span class="w"> </span><span class="n">year_vecs</span><span class="p">{</span><span class="n">years</span><span class="p">,</span><span class="w"> </span><span class="n">years2</span><span class="p">};</span>
<span class="linenos">133</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">ChunkedArray</span><span class="o">&gt;</span><span class="w"> </span><span class="n">year_chunks</span><span class="w"> </span><span class="o">=</span>
<span class="linenos">134</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ChunkedArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">year_vecs</span><span class="p">);</span>
<span class="linenos">135</span><span class="w"> </span><span class="c1">// (Doc section: ChunkedArray Month Year)</span>
<span class="linenos">136</span>
<span class="linenos">137</span><span class="w"> </span><span class="c1">// (Doc section: Table)</span>
<span class="linenos">138</span><span class="w"> </span><span class="c1">// A Table is the structure we need for these non-contiguous columns, and keeps them</span>
<span class="linenos">139</span><span class="w"> </span><span class="c1">// all in one place for us so we can use them as if they were normal arrays.</span>
<span class="linenos">140</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">141</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">day_chunks</span><span class="p">,</span><span class="w"> </span><span class="n">month_chunks</span><span class="p">,</span><span class="w"> </span><span class="n">year_chunks</span><span class="p">},</span><span class="w"> </span><span class="mi">10</span><span class="p">);</span>
<span class="linenos">142</span>
<span class="linenos">143</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">table</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">();</span>
<span class="linenos">144</span><span class="w"> </span><span class="c1">// (Doc section: Table)</span>
<span class="linenos">145</span>
<span class="linenos">146</span><span class="w"> </span><span class="c1">// (Doc section: Ret)</span>
<span class="linenos">147</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">148</span><span class="p">}</span>
<span class="linenos">149</span><span class="c1">// (Doc section: Ret)</span>
<span class="linenos">150</span>
<span class="linenos">151</span><span class="c1">// (Doc section: Main)</span>
<span class="linenos">152</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">153</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">154</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">155</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">156</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">157</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">158</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">159</span><span class="p">}</span>
<span class="linenos">160</span>
<span class="linenos">161</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="../conventions.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">Conventions</p>
</div>
</a>
<a class="right-next"
href="io_tutorial.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
<p class="prev-next-title">Arrow File I/O</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>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#making-an-arrow-array">Making an Arrow 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="#building-int8-arrays">Building int8 Arrays</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#building-int16-arrays">Building int16 Arrays</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#making-a-recordbatch">Making a RecordBatch</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#defining-a-schema">Defining a Schema</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#building-a-recordbatch">Building a RecordBatch</a></li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#making-a-chunkedarray">Making a ChunkedArray</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#making-a-table">Making a Table</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#ending-program">Ending Program</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#wrapping-up">Wrapping Up</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/basic_arrow.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>