blob: 0b640a87da26c5e0317729ae230882904a140e5c [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>Row to columnar conversion &#8212; Apache Arrow v17.0.0.dev77</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/examples/row_columnar_conversion';</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/examples/row_columnar_conversion.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="Conversion of range of std::tuple-like to Table instances" href="tuple_range_conversion.html" />
<link rel="prev" title="Arrow Skyhook example" href="dataset_skyhook_scan_example.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.dev77 - Home"/>
<script>document.write(`<img src="../../_static/arrow-dark.png" class="logo__image only-dark" alt="Apache Arrow v17.0.0.dev77 - 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 has-children"><a class="reference internal" href="../getting_started.html">Getting Started</a><input 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>
<li class="toctree-l2"><a class="reference internal" href="../build_system.html">Using Arrow C++ in your own project</a></li>
<li class="toctree-l2"><a class="reference internal" href="../conventions.html">Conventions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/basic_arrow.html">Basic Arrow Data Structures</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/io_tutorial.html">Arrow File I/O</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/compute_tutorial.html">Arrow Compute</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/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 current active has-children"><a class="reference internal" href="index.html">Examples</a><input checked="" 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 class="current">
<li class="toctree-l2"><a class="reference internal" href="cmake_minimal_build.html">Minimal build using CMake</a></li>
<li class="toctree-l2"><a class="reference internal" href="compute_and_write_example.html">Compute and Write CSV Example</a></li>
<li class="toctree-l2"><a class="reference internal" href="dataset_documentation_example.html">Arrow Datasets example</a></li>
<li class="toctree-l2"><a class="reference internal" href="dataset_skyhook_scan_example.html">Arrow Skyhook example</a></li>
<li class="toctree-l2 current active"><a class="current reference internal" href="#">Row to columnar conversion</a></li>
<li class="toctree-l2"><a class="reference internal" href="tuple_range_conversion.html">std::tuple-like ranges to Arrow</a></li>
<li class="toctree-l2"><a class="reference internal" href="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="index.html" class="nav-link">Examples</a></li>
<li class="breadcrumb-item active" aria-current="page">Row to...</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="row-to-columnar-conversion">
<h1>Row to columnar conversion<a class="headerlink" href="#row-to-columnar-conversion" title="Permalink to this heading">#</a></h1>
<section id="fixed-schemas">
<h2>Fixed Schemas<a class="headerlink" href="#fixed-schemas" title="Permalink to this heading">#</a></h2>
<p>The following example converts an array of structs to 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">arrow::Table</span></code></a>
instance, and then converts it back to the original array of structs.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="c1">// Licensed to the Apache Software Foundation (ASF) under one</span>
<span class="c1">// or more contributor license agreements. See the NOTICE file</span>
<span class="c1">// distributed with this work for additional information</span>
<span class="c1">// regarding copyright ownership. The ASF licenses this file</span>
<span class="c1">// to you under the Apache License, Version 2.0 (the</span>
<span class="c1">// &quot;License&quot;); you may not use this file except in compliance</span>
<span class="c1">// with the License. You may obtain a copy of the License at</span>
<span class="c1">//</span>
<span class="c1">// http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c1">//</span>
<span class="c1">// Unless required by applicable law or agreed to in writing,</span>
<span class="c1">// software distributed under the License is distributed on an</span>
<span class="c1">// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
<span class="c1">// KIND, either express or implied. See the License for the</span>
<span class="c1">// specific language governing permissions and limitations</span>
<span class="c1">// under the License.</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/api.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;arrow/result.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;cstdint&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iomanip&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;vector&gt;</span>
<span class="k">using</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">DoubleBuilder</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Builder</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ListBuilder</span><span class="p">;</span>
<span class="c1">// While we want to use columnar data structures to build efficient operations, we</span>
<span class="c1">// often receive data in a row-wise fashion from other systems. In the following,</span>
<span class="c1">// we want give a brief introduction into the classes provided by Apache Arrow by</span>
<span class="c1">// showing how to transform row-wise data into a columnar table.</span>
<span class="c1">//</span>
<span class="c1">// The table contains an id for a product, the number of components in the product</span>
<span class="c1">// and the cost of each component.</span>
<span class="c1">//</span>
<span class="c1">// The data in this example is stored in the following struct:</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">data_row</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">id</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">components</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span><span class="w"> </span><span class="n">component_cost</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1">// Transforming a vector of structs into a columnar Table.</span>
<span class="c1">//</span>
<span class="c1">// The final representation should be an `arrow::Table` which in turn</span>
<span class="c1">// is made up of an `arrow::Schema` and a list of</span>
<span class="c1">// `arrow::ChunkedArray` instances. As the first step, we will iterate</span>
<span class="c1">// over the data and build up the arrays incrementally. For this</span>
<span class="c1">// task, we provide `arrow::ArrayBuilder` classes that help in the</span>
<span class="c1">// construction of the final `arrow::Array` instances.</span>
<span class="c1">//</span>
<span class="c1">// For each type, Arrow has a specially typed builder class. For the primitive</span>
<span class="c1">// values `id` and `components` we can use the `arrow::Int64Builder`. For the</span>
<span class="c1">// `component_cost` vector, we need to have two builders, a top-level</span>
<span class="c1">// `arrow::ListBuilder` that builds the array of offsets and a nested</span>
<span class="c1">// `arrow::DoubleBuilder` that constructs the underlying values array that</span>
<span class="c1">// is referenced by the offsets in the former array.</span>
<span class="n">arrow</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</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;&gt;</span><span class="w"> </span><span class="n">VectorToColumnarTable</span><span class="p">(</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="k">struct</span><span class="w"> </span><span class="nc">data_row</span><span class="o">&gt;&amp;</span><span class="w"> </span><span class="n">rows</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// The builders are more efficient using</span>
<span class="w"> </span><span class="c1">// arrow::jemalloc::MemoryPool::default_pool() as this can increase the size of</span>
<span class="w"> </span><span class="c1">// the underlying memory regions in-place. At the moment, arrow::jemalloc is only</span>
<span class="w"> </span><span class="c1">// supported on Unix systems, not Windows.</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">MemoryPool</span><span class="o">*</span><span class="w"> </span><span class="n">pool</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">default_memory_pool</span><span class="p">();</span>
<span class="w"> </span><span class="n">Int64Builder</span><span class="w"> </span><span class="nf">id_builder</span><span class="p">(</span><span class="n">pool</span><span class="p">);</span>
<span class="w"> </span><span class="n">Int64Builder</span><span class="w"> </span><span class="nf">components_builder</span><span class="p">(</span><span class="n">pool</span><span class="p">);</span>
<span class="w"> </span><span class="n">ListBuilder</span><span class="w"> </span><span class="nf">component_cost_builder</span><span class="p">(</span><span class="n">pool</span><span class="p">,</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">DoubleBuilder</span><span class="o">&gt;</span><span class="p">(</span><span class="n">pool</span><span class="p">));</span>
<span class="w"> </span><span class="c1">// The following builder is owned by component_cost_builder.</span>
<span class="w"> </span><span class="n">DoubleBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">component_item_cost_builder</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="p">(</span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">DoubleBuilder</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">component_cost_builder</span><span class="p">.</span><span class="n">value_builder</span><span class="p">()));</span>
<span class="w"> </span><span class="c1">// Now we can loop over our existing data and insert it into the builders. The</span>
<span class="w"> </span><span class="c1">// `Append` calls here may fail (e.g. we cannot allocate enough additional memory).</span>
<span class="w"> </span><span class="c1">// Thus we need to check their return values. For more information on these values,</span>
<span class="w"> </span><span class="c1">// check the documentation about `arrow::Status`.</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">data_row</span><span class="o">&amp;</span><span class="w"> </span><span class="n">row</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">rows</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">id_builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="n">row</span><span class="p">.</span><span class="n">id</span><span class="p">));</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">components_builder</span><span class="p">.</span><span class="n">Append</span><span class="p">(</span><span class="n">row</span><span class="p">.</span><span class="n">components</span><span class="p">));</span>
<span class="w"> </span><span class="c1">// Indicate the start of a new list row. This will memorise the current</span>
<span class="w"> </span><span class="c1">// offset in the values builder.</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">component_cost_builder</span><span class="p">.</span><span class="n">Append</span><span class="p">());</span>
<span class="w"> </span><span class="c1">// Store the actual values. The same memory layout is</span>
<span class="w"> </span><span class="c1">// used for the component cost data, in this case a vector of</span>
<span class="w"> </span><span class="c1">// type double, as for the memory that Arrow uses to hold this</span>
<span class="w"> </span><span class="c1">// data and will be created.</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">component_item_cost_builder</span><span class="o">-&gt;</span><span class="n">AppendValues</span><span class="p">(</span>
<span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="n">component_cost</span><span class="p">.</span><span class="n">data</span><span class="p">(),</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="n">component_cost</span><span class="p">.</span><span class="n">size</span><span class="p">()));</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">// At the end, we finalise the arrays, declare the (type) schema and combine them</span>
<span class="w"> </span><span class="c1">// into a single `arrow::Table`:</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">id_array</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">id_builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">(</span><span class="o">&amp;</span><span class="n">id_array</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">components_array</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">components_builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">(</span><span class="o">&amp;</span><span class="n">components_array</span><span class="p">));</span>
<span class="w"> </span><span class="c1">// No need to invoke component_item_cost_builder.Finish because it is implied by</span>
<span class="w"> </span><span class="c1">// the parent builder&#39;s Finish invocation.</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">component_cost_array</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">component_cost_builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">(</span><span class="o">&amp;</span><span class="n">component_cost_array</span><span class="p">));</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</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;&gt;</span><span class="w"> </span><span class="n">schema_vector</span><span class="w"> </span><span class="o">=</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">field</span><span class="p">(</span><span class="s">&quot;id&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int64</span><span class="p">()),</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;components&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int64</span><span class="p">()),</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;component_cost&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">list</span><span class="p">(</span><span class="n">arrow</span><span class="o">::</span><span class="n">float64</span><span class="p">()))};</span>
<span class="w"> </span><span class="k">auto</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">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">Schema</span><span class="o">&gt;</span><span class="p">(</span><span class="n">schema_vector</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// The final `table` variable is the one we can then pass on to other functions</span>
<span class="w"> </span><span class="c1">// that can consume Apache Arrow memory structures. This object has ownership of</span>
<span class="w"> </span><span class="c1">// all referenced data, thus we don&#39;t have to care about undefined references once</span>
<span class="w"> </span><span class="c1">// we leave the scope of the function building the table and its underlying 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="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">id_array</span><span class="p">,</span><span class="w"> </span><span class="n">components_array</span><span class="p">,</span><span class="w"> </span><span class="n">component_cost_array</span><span class="p">});</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">table</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">arrow</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">data_row</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">ColumnarTableToVector</span><span class="p">(</span>
<span class="w"> </span><span class="k">const</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;&amp;</span><span class="w"> </span><span class="n">table</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// To convert an Arrow table back into the same row-wise representation as in the</span>
<span class="w"> </span><span class="c1">// above section, we first will check that the table conforms to our expected</span>
<span class="w"> </span><span class="c1">// schema and then will build up the vector of rows incrementally.</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// For the check if the table is as expected, we can utilise solely its schema.</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</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;&gt;</span><span class="w"> </span><span class="n">schema_vector</span><span class="w"> </span><span class="o">=</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">field</span><span class="p">(</span><span class="s">&quot;id&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int64</span><span class="p">()),</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;components&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int64</span><span class="p">()),</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;component_cost&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">list</span><span class="p">(</span><span class="n">arrow</span><span class="o">::</span><span class="n">float64</span><span class="p">()))};</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">expected_schema</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">Schema</span><span class="o">&gt;</span><span class="p">(</span><span class="n">schema_vector</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">expected_schema</span><span class="o">-&gt;</span><span class="n">Equals</span><span class="p">(</span><span class="o">*</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">schema</span><span class="p">()))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// The table doesn&#39;t have the expected schema thus we cannot directly</span>
<span class="w"> </span><span class="c1">// convert it to our target representation.</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">Invalid</span><span class="p">(</span><span class="s">&quot;Schemas are not matching!&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">// As we have ensured that the table has the expected structure, we can unpack the</span>
<span class="w"> </span><span class="c1">// underlying arrays. For the primitive columns `id` and `components` we can use the</span>
<span class="w"> </span><span class="c1">// high level functions to get the values whereas for the nested column</span>
<span class="w"> </span><span class="c1">// `component_costs` we need to access the C-pointer to the data to copy its</span>
<span class="w"> </span><span class="c1">// contents into the resulting `std::vector&lt;double&gt;`. Here we need to be careful to</span>
<span class="w"> </span><span class="c1">// also add the offset to the pointer. This offset is needed to enable zero-copy</span>
<span class="w"> </span><span class="c1">// slicing operations. While this could be adjusted automatically for double</span>
<span class="w"> </span><span class="c1">// arrays, this cannot be done for the accompanying bitmap as often the slicing</span>
<span class="w"> </span><span class="c1">// border would be inside a byte.</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">ids</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">static_pointer_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Array</span><span class="o">&gt;</span><span class="p">(</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">column</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">chunk</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">components</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">static_pointer_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Array</span><span class="o">&gt;</span><span class="p">(</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">column</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">chunk</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">component_cost</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">static_pointer_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ListArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">table</span><span class="o">-&gt;</span><span class="n">column</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">chunk</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">component_cost_values</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">static_pointer_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">DoubleArray</span><span class="o">&gt;</span><span class="p">(</span><span class="n">component_cost</span><span class="o">-&gt;</span><span class="n">values</span><span class="p">());</span>
<span class="w"> </span><span class="c1">// To enable zero-copy slices, the native values pointer might need to account</span>
<span class="w"> </span><span class="c1">// for this slicing offset. This is not needed for the higher level functions</span>
<span class="w"> </span><span class="c1">// like Value(…) that already account for this offset internally.</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="w"> </span><span class="n">ccv_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">component_cost_values</span><span class="o">-&gt;</span><span class="n">raw_values</span><span class="p">();</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">data_row</span><span class="o">&gt;</span><span class="w"> </span><span class="n">rows</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">table</span><span class="o">-&gt;</span><span class="n">num_rows</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Another simplification in this example is that we assume that there are</span>
<span class="w"> </span><span class="c1">// no null entries, e.g. each row is fill with valid values.</span>
<span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ids</span><span class="o">-&gt;</span><span class="n">Value</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">component</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">components</span><span class="o">-&gt;</span><span class="n">Value</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="w"> </span><span class="n">first</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ccv_ptr</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">component_cost</span><span class="o">-&gt;</span><span class="n">value_offset</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">double</span><span class="o">*</span><span class="w"> </span><span class="n">last</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ccv_ptr</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">component_cost</span><span class="o">-&gt;</span><span class="n">value_offset</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span><span class="w"> </span><span class="n">components_vec</span><span class="p">(</span><span class="n">first</span><span class="p">,</span><span class="w"> </span><span class="n">last</span><span class="p">);</span>
<span class="w"> </span><span class="n">rows</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">component</span><span class="p">,</span><span class="w"> </span><span class="n">components_vec</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="n">rows</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="n">RunRowConversion</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">vector</span><span class="o">&lt;</span><span class="n">data_row</span><span class="o">&gt;</span><span class="w"> </span><span class="n">original_rows</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</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">1</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="mf">10.0</span><span class="p">}},</span><span class="w"> </span><span class="p">{</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="mf">11.0</span><span class="p">,</span><span class="w"> </span><span class="mf">12.0</span><span class="p">,</span><span class="w"> </span><span class="mf">13.0</span><span class="p">}},</span><span class="w"> </span><span class="p">{</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="p">{</span><span class="mf">15.0</span><span class="p">,</span><span class="w"> </span><span class="mf">25.0</span><span class="p">}}};</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Table</span><span class="o">&gt;</span><span class="w"> </span><span class="n">table</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">data_row</span><span class="o">&gt;</span><span class="w"> </span><span class="n">converted_rows</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">table</span><span class="p">,</span><span class="w"> </span><span class="n">VectorToColumnarTable</span><span class="p">(</span><span class="n">original_rows</span><span class="p">));</span>
<span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">converted_rows</span><span class="p">,</span><span class="w"> </span><span class="n">ColumnarTableToVector</span><span class="p">(</span><span class="n">table</span><span class="p">));</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">original_rows</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">converted_rows</span><span class="p">.</span><span class="n">size</span><span class="p">());</span>
<span class="w"> </span><span class="c1">// Print out contents of table, should get</span>
<span class="w"> </span><span class="c1">// ID Components Component prices</span>
<span class="w"> </span><span class="c1">// 1 1 10</span>
<span class="w"> </span><span class="c1">// 2 3 11 12 13</span>
<span class="w"> </span><span class="c1">// 3 2 15 25</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">std</span><span class="o">::</span><span class="n">left</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">setw</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;ID &quot;</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">left</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">setw</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
<span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Components &quot;</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">left</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">setw</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Component prices &quot;</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">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">row</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">converted_rows</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">cout</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">left</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">setw</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="n">id</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">left</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">setw</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
<span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="n">components</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">cost</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="n">component_cost</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">cout</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">left</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">setw</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">cost</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">cout</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="p">}</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>
<span class="kt">int</span><span class="w"> </span><span class="n">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">**</span><span class="w"> </span><span class="n">argv</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RunRowConversion</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">status</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">status</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="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="n">EXIT_FAILURE</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="n">EXIT_SUCCESS</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="dynamic-schemas">
<h2>Dynamic Schemas<a class="headerlink" href="#dynamic-schemas" title="Permalink to this heading">#</a></h2>
<p>In many cases, we need to convert to and from row data that does not have a
schema known at compile time. To help implement these conversions, this library
provides several utilities:</p>
<ul class="simple">
<li><p><a class="reference internal" href="../api/builder.html#_CPPv4N5arrow18RecordBatchBuilderE" title="arrow::RecordBatchBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::RecordBatchBuilder</span></code></a>: creates and manages array builders for
a full record batch.</p></li>
<li><p><a class="reference internal" href="../api/utilities.html#_CPPv4I0DpEN5arrow15VisitTypeInlineE6StatusRK8DataTypeP7VISITORDpRR4ARGS" title="arrow::VisitTypeInline"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">arrow::VisitTypeInline()</span></code></a>: dispatch to functions specialized for the given
array type.</p></li>
<li><p><a class="reference internal" href="../api/utilities.html#type-traits"><span class="std std-ref">Type Traits</span></a> (such as <code class="docutils literal notranslate"><span class="pre">arrow::enable_if_primitive_ctype</span></code>): narrow template
functions to specific Arrow types, useful in conjunction with
the <a class="reference internal" href="../datatypes.html#cpp-visitor-pattern"><span class="std std-ref">Visitor Pattern</span></a>.</p></li>
<li><p><a class="reference internal" href="../api/table.html#_CPPv4N5arrow16TableBatchReaderE" title="arrow::TableBatchReader"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::TableBatchReader</span></code></a>: read a table in a batch at a time, with each
batch being a zero-copy slice.</p></li>
</ul>
<p>The following example shows how to implement conversion between <code class="docutils literal notranslate"><span class="pre">rapidjson::Document</span></code>
and Arrow objects. You can read the full code example at
<a class="github reference external" href="https://github.com/apache/arrow/blob/main/cpp/examples/arrow/rapidjson_row_converter.cc">apache/arrow</a></p>
<section id="writing-conversions-to-arrow">
<h3>Writing conversions to Arrow<a class="headerlink" href="#writing-conversions-to-arrow" title="Permalink to this heading">#</a></h3>
<p>To convert rows to Arrow record batches, we’ll setup Array builders for all the columns
and then for each field iterate through row values and append to the builders.
We assume that we already know the target schema, which may have
been provided by another system or was inferred in another function. Inferring
the schema <em>during</em> conversion is a challenging proposition; many systems will
check the first N rows to infer a schema if there is none already available.</p>
<p>At the top level, we define a function <code class="docutils literal notranslate"><span class="pre">ConvertToRecordBatch</span></code>:</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="linenos">495</span><span class="n">arrow</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</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;&gt;</span><span class="w"> </span><span class="n">ConvertToRecordBatch</span><span class="p">(</span>
<span class="linenos">496</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;&amp;</span><span class="w"> </span><span class="n">rows</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="p">{</span>
<span class="linenos">497</span><span class="w"> </span><span class="c1">// RecordBatchBuilder will create array builders for us for each field in our</span>
<span class="linenos">498</span><span class="w"> </span><span class="c1">// schema. By passing the number of output rows (`rows.size()`) we can</span>
<span class="linenos">499</span><span class="w"> </span><span class="c1">// pre-allocate the correct size of arrays, except of course in the case of</span>
<span class="linenos">500</span><span class="w"> </span><span class="c1">// string, byte, and list arrays, which have dynamic lengths.</span>
<span class="linenos">501</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">RecordBatchBuilder</span><span class="o">&gt;</span><span class="w"> </span><span class="n">batch_builder</span><span class="p">;</span>
<span class="linenos">502</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span>
<span class="linenos">503</span><span class="w"> </span><span class="n">batch_builder</span><span class="p">,</span>
<span class="linenos">504</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">RecordBatchBuilder</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">arrow</span><span class="o">::</span><span class="n">default_memory_pool</span><span class="p">(),</span><span class="w"> </span><span class="n">rows</span><span class="p">.</span><span class="n">size</span><span class="p">()));</span>
<span class="linenos">505</span>
<span class="linenos">506</span><span class="w"> </span><span class="c1">// Inner converter will take rows and be responsible for appending values</span>
<span class="linenos">507</span><span class="w"> </span><span class="c1">// to provided array builders.</span>
<span class="linenos">508</span><span class="w"> </span><span class="n">JsonValueConverter</span><span class="w"> </span><span class="nf">converter</span><span class="p">(</span><span class="n">rows</span><span class="p">);</span>
<span class="linenos">509</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">batch_builder</span><span class="o">-&gt;</span><span class="n">num_fields</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">510</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</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">schema</span><span class="o">-&gt;</span><span class="n">field</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="linenos">511</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">batch_builder</span><span class="o">-&gt;</span><span class="n">GetField</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="linenos">512</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">converter</span><span class="p">.</span><span class="n">Convert</span><span class="p">(</span><span class="o">*</span><span class="n">field</span><span class="p">.</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="n">builder</span><span class="p">));</span>
<span class="linenos">513</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">514</span>
<span class="linenos">515</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">batch</span><span class="p">;</span>
<span class="linenos">516</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">batch</span><span class="p">,</span><span class="w"> </span><span class="n">batch_builder</span><span class="o">-&gt;</span><span class="n">Flush</span><span class="p">());</span>
<span class="linenos">517</span>
<span class="linenos">518</span><span class="w"> </span><span class="c1">// Use RecordBatch::ValidateFull() to make sure arrays were correctly constructed.</span>
<span class="linenos">519</span><span class="w"> </span><span class="n">DCHECK_OK</span><span class="p">(</span><span class="n">batch</span><span class="o">-&gt;</span><span class="n">ValidateFull</span><span class="p">());</span>
<span class="linenos">520</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">batch</span><span class="p">;</span>
<span class="linenos">521</span><span class="p">}</span><span class="w"> </span><span class="c1">// ConvertToRecordBatch</span>
</pre></div>
</div>
<p>First we use <a class="reference internal" href="../api/builder.html#_CPPv4N5arrow18RecordBatchBuilderE" title="arrow::RecordBatchBuilder"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::RecordBatchBuilder</span></code></a>, which conveniently creates builders
for each field in the schema. Then we iterate over the fields of the schema, get
the builder, and call <code class="docutils literal notranslate"><span class="pre">Convert()</span></code> on our <code class="docutils literal notranslate"><span class="pre">JsonValueConverter</span></code> (to be discussed
next). At the end, we call <code class="docutils literal notranslate"><span class="pre">batch-&gt;ValidateFull()</span></code>, which checks the integrity
of our arrays to make sure the conversion was performed correctly, which is useful
for debugging new conversion implementations.</p>
<p>One level down, the <code class="docutils literal notranslate"><span class="pre">JsonValueConverter</span></code> is responsible for appending row values
for the provided field to a provided array builder. In order to specialize logic
for each data type, it implements <code class="docutils literal notranslate"><span class="pre">Visit</span></code> methods and calls <a class="reference internal" href="../api/utilities.html#_CPPv4I0DpEN5arrow15VisitTypeInlineE6StatusRK8DataTypeP7VISITORDpRR4ARGS" title="arrow::VisitTypeInline"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">arrow::VisitTypeInline()</span></code></a>.
(See more about type visitors in <a class="reference internal" href="../datatypes.html#cpp-visitor-pattern"><span class="std std-ref">Visitor Pattern</span></a>.)</p>
<p>At the end of that class is the private method <code class="docutils literal notranslate"><span class="pre">FieldValues()</span></code>, which returns
an iterator of the column values for the current field across the rows. In
row-based structures that are flat (such as a vector of values) this may be
trivial to implement. But if the schema is nested, as in the case of JSON documents,
a special iterator is needed to navigate the levels of nesting. See the
<a class="reference external" href="https://github.com/apache/arrow/blob/main/cpp/examples/arrow/rapidjson_row_converter.cc">full example</a>
for the implementation details of <code class="docutils literal notranslate"><span class="pre">DocValuesIterator</span></code>.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="linenos">323</span><span class="k">class</span><span class="w"> </span><span class="nc">JsonValueConverter</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">324</span><span class="w"> </span><span class="k">public</span><span class="o">:</span>
<span class="linenos">325</span><span class="w"> </span><span class="k">explicit</span><span class="w"> </span><span class="n">JsonValueConverter</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;&amp;</span><span class="w"> </span><span class="n">rows</span><span class="p">)</span>
<span class="linenos">326</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">rows_</span><span class="p">(</span><span class="n">rows</span><span class="p">),</span><span class="w"> </span><span class="n">array_levels_</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span>
<span class="linenos">327</span>
<span class="linenos">328</span><span class="w"> </span><span class="n">JsonValueConverter</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;&amp;</span><span class="w"> </span><span class="n">rows</span><span class="p">,</span>
<span class="linenos">329</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;&amp;</span><span class="w"> </span><span class="n">root_path</span><span class="p">,</span><span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">array_levels</span><span class="p">)</span>
<span class="linenos">330</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">rows_</span><span class="p">(</span><span class="n">rows</span><span class="p">),</span><span class="w"> </span><span class="n">root_path_</span><span class="p">(</span><span class="n">root_path</span><span class="p">),</span><span class="w"> </span><span class="n">array_levels_</span><span class="p">(</span><span class="n">array_levels</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span>
<span class="linenos">331</span>
<span class="linenos">332</span><span class="w"> </span><span class="c1">/// \brief For field passed in, append corresponding values to builder</span>
<span class="linenos">333</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">Convert</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">&amp;</span><span class="w"> </span><span class="n">field</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">334</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Convert</span><span class="p">(</span><span class="n">field</span><span class="p">,</span><span class="w"> </span><span class="n">field</span><span class="p">.</span><span class="n">name</span><span class="p">(),</span><span class="w"> </span><span class="n">builder</span><span class="p">);</span>
<span class="linenos">335</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">336</span>
<span class="linenos">337</span><span class="w"> </span><span class="c1">/// \brief For field passed in, append corresponding values to builder</span>
<span class="linenos">338</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">Convert</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">&amp;</span><span class="w"> </span><span class="n">field</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span><span class="w"> </span><span class="n">field_name</span><span class="p">,</span>
<span class="linenos">339</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">340</span><span class="w"> </span><span class="n">field_name_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">field_name</span><span class="p">;</span>
<span class="linenos">341</span><span class="w"> </span><span class="n">builder_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">;</span>
<span class="linenos">342</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">arrow</span><span class="o">::</span><span class="n">VisitTypeInline</span><span class="p">(</span><span class="o">*</span><span class="n">field</span><span class="p">.</span><span class="n">type</span><span class="p">().</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="k">this</span><span class="p">));</span>
<span class="linenos">343</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">344</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">345</span>
<span class="linenos">346</span><span class="w"> </span><span class="c1">// Default implementation</span>
<span class="linenos">347</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">DataType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">348</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">NotImplemented</span><span class="p">(</span>
<span class="linenos">349</span><span class="w"> </span><span class="s">&quot;Cannot convert json value to Arrow array of type &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="p">.</span><span class="n">ToString</span><span class="p">());</span>
<span class="linenos">350</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">351</span>
<span class="linenos">352</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Type</span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">353</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Builder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Int64Builder</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">builder_</span><span class="p">);</span>
<span class="linenos">354</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">maybe_value</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FieldValues</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">355</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">maybe_value</span><span class="p">);</span>
<span class="linenos">356</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsNull</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">357</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">AppendNull</span><span class="p">());</span>
<span class="linenos">358</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">359</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsUint</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">360</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">GetUint</span><span class="p">()));</span>
<span class="linenos">361</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsInt</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">362</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">GetInt</span><span class="p">()));</span>
<span class="linenos">363</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsUint64</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">364</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">GetUint64</span><span class="p">()));</span>
<span class="linenos">365</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsInt64</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">366</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">GetInt64</span><span class="p">()));</span>
<span class="linenos">367</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">368</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">Invalid</span><span class="p">(</span><span class="s">&quot;Value is not an integer&quot;</span><span class="p">);</span>
<span class="linenos">369</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">370</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">371</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">372</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">373</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">374</span>
<span class="linenos">375</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">DoubleType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">376</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">DoubleBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">DoubleBuilder</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">builder_</span><span class="p">);</span>
<span class="linenos">377</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">maybe_value</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FieldValues</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">378</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">maybe_value</span><span class="p">);</span>
<span class="linenos">379</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsNull</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">380</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">AppendNull</span><span class="p">());</span>
<span class="linenos">381</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">382</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">GetDouble</span><span class="p">()));</span>
<span class="linenos">383</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">384</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">385</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">386</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">387</span>
<span class="linenos">388</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">StringType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">389</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">StringBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">StringBuilder</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">builder_</span><span class="p">);</span>
<span class="linenos">390</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">maybe_value</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FieldValues</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">391</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">maybe_value</span><span class="p">);</span>
<span class="linenos">392</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsNull</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">393</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">AppendNull</span><span class="p">());</span>
<span class="linenos">394</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">395</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">GetString</span><span class="p">()));</span>
<span class="linenos">396</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">397</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">398</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">399</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">400</span>
<span class="linenos">401</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">BooleanType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">402</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">BooleanBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">BooleanBuilder</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">builder_</span><span class="p">);</span>
<span class="linenos">403</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">maybe_value</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FieldValues</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">404</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">maybe_value</span><span class="p">);</span>
<span class="linenos">405</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsNull</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">406</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">AppendNull</span><span class="p">());</span>
<span class="linenos">407</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">408</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">GetBool</span><span class="p">()));</span>
<span class="linenos">409</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">410</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">411</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">412</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">413</span>
<span class="linenos">414</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">StructType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">415</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">StructBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">StructBuilder</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">builder_</span><span class="p">);</span>
<span class="linenos">416</span>
<span class="linenos">417</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">child_path</span><span class="p">(</span><span class="n">root_path_</span><span class="p">);</span>
<span class="linenos">418</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">field_name_</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">419</span><span class="w"> </span><span class="n">child_path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">field_name_</span><span class="p">);</span>
<span class="linenos">420</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">421</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">child_converter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JsonValueConverter</span><span class="p">(</span><span class="n">rows_</span><span class="p">,</span><span class="w"> </span><span class="n">child_path</span><span class="p">,</span><span class="w"> </span><span class="n">array_levels_</span><span class="p">);</span>
<span class="linenos">422</span>
<span class="linenos">423</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">type</span><span class="p">.</span><span class="n">num_fields</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">424</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">child_field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type</span><span class="p">.</span><span class="n">field</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="linenos">425</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">ArrayBuilder</span><span class="o">&gt;</span><span class="w"> </span><span class="n">child_builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">child_builder</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="linenos">426</span>
<span class="linenos">427</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span>
<span class="linenos">428</span><span class="w"> </span><span class="n">child_converter</span><span class="p">.</span><span class="n">Convert</span><span class="p">(</span><span class="o">*</span><span class="n">child_field</span><span class="p">.</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="n">child_builder</span><span class="p">.</span><span class="n">get</span><span class="p">()));</span>
<span class="linenos">429</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">430</span>
<span class="linenos">431</span><span class="w"> </span><span class="c1">// Make null bitmap</span>
<span class="linenos">432</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">maybe_value</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FieldValues</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">433</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">maybe_value</span><span class="p">);</span>
<span class="linenos">434</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="o">!</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsNull</span><span class="p">()));</span>
<span class="linenos">435</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">436</span>
<span class="linenos">437</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">438</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">439</span>
<span class="linenos">440</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ListType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">441</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ListBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ListBuilder</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">builder_</span><span class="p">);</span>
<span class="linenos">442</span>
<span class="linenos">443</span><span class="w"> </span><span class="c1">// Values and offsets needs to be interleaved in ListBuilder, so first collect the</span>
<span class="linenos">444</span><span class="w"> </span><span class="c1">// values</span>
<span class="linenos">445</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayBuilder</span><span class="o">&gt;</span><span class="w"> </span><span class="n">tmp_value_builder</span><span class="p">;</span>
<span class="linenos">446</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="n">tmp_value_builder</span><span class="p">,</span>
<span class="linenos">447</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">MakeBuilder</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">value_builder</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">type</span><span class="p">()));</span>
<span class="linenos">448</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">child_path</span><span class="p">(</span><span class="n">root_path_</span><span class="p">);</span>
<span class="linenos">449</span><span class="w"> </span><span class="n">child_path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">field_name_</span><span class="p">);</span>
<span class="linenos">450</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">child_converter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JsonValueConverter</span><span class="p">(</span><span class="n">rows_</span><span class="p">,</span><span class="w"> </span><span class="n">child_path</span><span class="p">,</span><span class="w"> </span><span class="n">array_levels_</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="linenos">451</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span>
<span class="linenos">452</span><span class="w"> </span><span class="n">child_converter</span><span class="p">.</span><span class="n">Convert</span><span class="p">(</span><span class="o">*</span><span class="n">type</span><span class="p">.</span><span class="n">value_field</span><span class="p">().</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">tmp_value_builder</span><span class="p">.</span><span class="n">get</span><span class="p">()));</span>
<span class="linenos">453</span>
<span class="linenos">454</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">values_array</span><span class="p">;</span>
<span class="linenos">455</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">tmp_value_builder</span><span class="o">-&gt;</span><span class="n">Finish</span><span class="p">(</span><span class="o">&amp;</span><span class="n">values_array</span><span class="p">));</span>
<span class="linenos">456</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">ArrayData</span><span class="o">&gt;</span><span class="w"> </span><span class="n">values_data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">values_array</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">();</span>
<span class="linenos">457</span>
<span class="linenos">458</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">value_builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">value_builder</span><span class="p">();</span>
<span class="linenos">459</span><span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">offset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="linenos">460</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">maybe_value</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FieldValues</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">461</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">maybe_value</span><span class="p">);</span>
<span class="linenos">462</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="o">-&gt;</span><span class="n">Append</span><span class="p">(</span><span class="o">!</span><span class="n">value</span><span class="o">-&gt;</span><span class="n">IsNull</span><span class="p">()));</span>
<span class="linenos">463</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">value</span><span class="o">-&gt;</span><span class="n">IsNull</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">value</span><span class="o">-&gt;</span><span class="n">Size</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">464</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span>
<span class="linenos">465</span><span class="w"> </span><span class="n">value_builder</span><span class="o">-&gt;</span><span class="n">AppendArraySlice</span><span class="p">(</span><span class="o">*</span><span class="n">values_data</span><span class="p">.</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="n">offset</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="o">-&gt;</span><span class="n">Size</span><span class="p">()));</span>
<span class="linenos">466</span><span class="w"> </span><span class="n">offset</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">value</span><span class="o">-&gt;</span><span class="n">Size</span><span class="p">();</span>
<span class="linenos">467</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">468</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">469</span>
<span class="linenos">470</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">471</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">472</span>
<span class="linenos">473</span><span class="w"> </span><span class="k">private</span><span class="o">:</span>
<span class="linenos">474</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">field_name_</span><span class="p">;</span>
<span class="linenos">475</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ArrayBuilder</span><span class="o">*</span><span class="w"> </span><span class="n">builder_</span><span class="p">;</span>
<span class="linenos">476</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;&amp;</span><span class="w"> </span><span class="n">rows_</span><span class="p">;</span>
<span class="linenos">477</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">root_path_</span><span class="p">;</span>
<span class="linenos">478</span><span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">array_levels_</span><span class="p">;</span>
<span class="linenos">479</span>
<span class="linenos">480</span><span class="w"> </span><span class="c1">/// Return a flattened iterator over values at nested location</span>
<span class="linenos">481</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Iterator</span><span class="o">&lt;</span><span class="k">const</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="o">*&gt;</span><span class="w"> </span><span class="n">FieldValues</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">482</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">path</span><span class="p">(</span><span class="n">root_path_</span><span class="p">);</span>
<span class="linenos">483</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">field_name_</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">484</span><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">field_name_</span><span class="p">);</span>
<span class="linenos">485</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">486</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">iter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DocValuesIterator</span><span class="p">(</span><span class="n">rows_</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">path</span><span class="p">),</span><span class="w"> </span><span class="n">array_levels_</span><span class="p">);</span>
<span class="linenos">487</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">fn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">iter</span><span class="p">]()</span><span class="w"> </span><span class="k">mutable</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</span><span class="k">const</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="o">*&gt;</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">488</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">iter</span><span class="p">.</span><span class="n">Next</span><span class="p">();</span>
<span class="linenos">489</span><span class="w"> </span><span class="p">};</span>
<span class="linenos">490</span>
<span class="linenos">491</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">MakeFunctionIterator</span><span class="p">(</span><span class="n">fn</span><span class="p">);</span>
<span class="linenos">492</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">493</span><span class="p">};</span><span class="w"> </span><span class="c1">// JsonValueConverter</span>
</pre></div>
</div>
</section>
<section id="writing-conversions-from-arrow">
<h3>Writing conversions from Arrow<a class="headerlink" href="#writing-conversions-from-arrow" title="Permalink to this heading">#</a></h3>
<p>To convert into rows <em>from</em> Arrow record batches, we’ll process the table in
smaller batches, visiting each field of the batch and filling the output rows
column-by-column.</p>
<p>At the top-level, we define <code class="docutils literal notranslate"><span class="pre">ArrowToDocumentConverter</span></code> that provides the API
for converting Arrow batches and tables to rows. In many cases, it’s more optimal
to perform conversions to rows in smaller batches, rather than doing the entire
table at once. So we define one <code class="docutils literal notranslate"><span class="pre">ConvertToVector</span></code> method to convert a single
batch, then in the other conversion method we use <a class="reference internal" href="../api/table.html#_CPPv4N5arrow16TableBatchReaderE" title="arrow::TableBatchReader"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::TableBatchReader</span></code></a>
to iterate over slices of a table. This returns Arrow’s iterator type
(<a class="reference internal" href="../api/utilities.html#_CPPv4I0EN5arrow8IteratorE" title="arrow::Iterator"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::Iterator</span></code></a>) so rows could then be processed either one-at-a-time
or be collected into a container.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="linenos">179</span><span class="k">class</span><span class="w"> </span><span class="nc">ArrowToDocumentConverter</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">180</span><span class="w"> </span><span class="k">public</span><span class="o">:</span>
<span class="linenos">181</span><span class="w"> </span><span class="c1">/// Convert a single batch of Arrow data into Documents</span>
<span class="linenos">182</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">ConvertToVector</span><span class="p">(</span>
<span class="linenos">183</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">batch</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">184</span><span class="w"> </span><span class="n">RowBatchBuilder</span><span class="w"> </span><span class="n">builder</span><span class="p">{</span><span class="n">batch</span><span class="o">-&gt;</span><span class="n">num_rows</span><span class="p">()};</span>
<span class="linenos">185</span>
<span class="linenos">186</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">batch</span><span class="o">-&gt;</span><span class="n">num_columns</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">187</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">SetField</span><span class="p">(</span><span class="n">batch</span><span class="o">-&gt;</span><span class="n">schema</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">field</span><span class="p">(</span><span class="n">i</span><span class="p">).</span><span class="n">get</span><span class="p">());</span>
<span class="linenos">188</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">arrow</span><span class="o">::</span><span class="n">VisitArrayInline</span><span class="p">(</span><span class="o">*</span><span class="n">batch</span><span class="o">-&gt;</span><span class="n">column</span><span class="p">(</span><span class="n">i</span><span class="p">).</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="o">&amp;</span><span class="n">builder</span><span class="p">));</span>
<span class="linenos">189</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">190</span>
<span class="linenos">191</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">builder</span><span class="p">).</span><span class="n">Rows</span><span class="p">();</span>
<span class="linenos">192</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">193</span>
<span class="linenos">194</span><span class="w"> </span><span class="c1">/// Convert an Arrow table into an iterator of Documents</span>
<span class="linenos">195</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Iterator</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;</span><span class="w"> </span><span class="n">ConvertToIterator</span><span class="p">(</span>
<span class="linenos">196</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="kt">size_t</span><span class="w"> </span><span class="n">batch_size</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">197</span><span class="w"> </span><span class="c1">// Use TableBatchReader to divide table into smaller batches. The batches</span>
<span class="linenos">198</span><span class="w"> </span><span class="c1">// created are zero-copy slices with *at most* `batch_size` rows.</span>
<span class="linenos">199</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">batch_reader</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">TableBatchReader</span><span class="o">&gt;</span><span class="p">(</span><span class="o">*</span><span class="n">table</span><span class="p">);</span>
<span class="linenos">200</span><span class="w"> </span><span class="n">batch_reader</span><span class="o">-&gt;</span><span class="n">set_chunksize</span><span class="p">(</span><span class="n">batch_size</span><span class="p">);</span>
<span class="linenos">201</span>
<span class="linenos">202</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">read_batch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="k">this</span><span class="p">](</span><span class="k">const</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;&amp;</span><span class="w"> </span><span class="n">batch</span><span class="p">)</span>
<span class="linenos">203</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Iterator</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">204</span><span class="w"> </span><span class="n">ARROW_ASSIGN_OR_RAISE</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">rows</span><span class="p">,</span><span class="w"> </span><span class="n">ConvertToVector</span><span class="p">(</span><span class="n">batch</span><span class="p">));</span>
<span class="linenos">205</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">MakeVectorIterator</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">rows</span><span class="p">));</span>
<span class="linenos">206</span><span class="w"> </span><span class="p">};</span>
<span class="linenos">207</span>
<span class="linenos">208</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">nested_iter</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">MakeMaybeMapIterator</span><span class="p">(</span>
<span class="linenos">209</span><span class="w"> </span><span class="n">read_batch</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">MakeIteratorFromReader</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">batch_reader</span><span class="p">)));</span>
<span class="linenos">210</span>
<span class="linenos">211</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">MakeFlattenIterator</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">nested_iter</span><span class="p">));</span>
<span class="linenos">212</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">213</span><span class="p">};</span><span class="w"> </span><span class="c1">// ArrowToDocumentConverter</span>
</pre></div>
</div>
<p>One level down, the output rows are filled in by <code class="docutils literal notranslate"><span class="pre">RowBatchBuilder</span></code>.
The <code class="docutils literal notranslate"><span class="pre">RowBatchBuilder</span></code> implements <code class="docutils literal notranslate"><span class="pre">Visit()</span></code> methods, but to save on code we
write a template method for array types that have primitive C equivalents
(booleans, integers, and floats) using <code class="docutils literal notranslate"><span class="pre">arrow::enable_if_primitive_ctype</span></code>.
See <a class="reference internal" href="../api/utilities.html#type-traits"><span class="std std-ref">Type Traits</span></a> for other type predicates.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 57</span><span class="k">class</span><span class="w"> </span><span class="nc">RowBatchBuilder</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 58</span><span class="w"> </span><span class="k">public</span><span class="o">:</span>
<span class="linenos"> 59</span><span class="w"> </span><span class="k">explicit</span><span class="w"> </span><span class="n">RowBatchBuilder</span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">num_rows</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">field_</span><span class="p">(</span><span class="k">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 60</span><span class="w"> </span><span class="c1">// Reserve all of the space required up-front to avoid unnecessary resizing</span>
<span class="linenos"> 61</span><span class="w"> </span><span class="n">rows_</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="n">num_rows</span><span class="p">);</span>
<span class="linenos"> 62</span>
<span class="linenos"> 63</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">num_rows</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 64</span><span class="w"> </span><span class="n">rows_</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="p">());</span>
<span class="linenos"> 65</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">SetObject</span><span class="p">();</span>
<span class="linenos"> 66</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 67</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 68</span>
<span class="linenos"> 69</span><span class="w"> </span><span class="c1">/// \brief Set which field to convert.</span>
<span class="linenos"> 70</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">SetField</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">*</span><span class="w"> </span><span class="n">field</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">field_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">field</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 71</span>
<span class="linenos"> 72</span><span class="w"> </span><span class="c1">/// \brief Retrieve converted rows from builder.</span>
<span class="linenos"> 73</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Rows</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">rows_</span><span class="p">);</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 74</span>
<span class="linenos"> 75</span><span class="w"> </span><span class="c1">// Default implementation</span>
<span class="linenos"> 76</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Array</span><span class="o">&amp;</span><span class="w"> </span><span class="n">array</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 77</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">NotImplemented</span><span class="p">(</span>
<span class="linenos"> 78</span><span class="w"> </span><span class="s">&quot;Cannot convert to json document for array of type &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">ToString</span><span class="p">());</span>
<span class="linenos"> 79</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 80</span>
<span class="linenos"> 81</span><span class="w"> </span><span class="c1">// Handles booleans, integers, floats</span>
<span class="linenos"> 82</span><span class="w"> </span><span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">typename</span><span class="w"> </span><span class="nc">ArrayType</span><span class="p">,</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">DataClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">typename</span><span class="w"> </span><span class="nc">ArrayType</span><span class="o">::</span><span class="n">TypeClass</span><span class="o">&gt;</span>
<span class="linenos"> 83</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">enable_if_primitive_ctype</span><span class="o">&lt;</span><span class="n">DataClass</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="o">&gt;</span><span class="w"> </span><span class="n">Visit</span><span class="p">(</span>
<span class="linenos"> 84</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">ArrayType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">array</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 85</span><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int64_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">rows_</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">());</span>
<span class="linenos"> 86</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 87</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">array</span><span class="p">.</span><span class="n">IsNull</span><span class="p">(</span><span class="n">i</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 88</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="nf">str_key</span><span class="p">(</span><span class="n">field_</span><span class="o">-&gt;</span><span class="n">name</span><span class="p">(),</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos"> 89</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">AddMember</span><span class="p">(</span><span class="n">str_key</span><span class="p">,</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">Value</span><span class="p">(</span><span class="n">i</span><span class="p">),</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos"> 90</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 91</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 92</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"> 93</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 94</span>
<span class="linenos"> 95</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">StringArray</span><span class="o">&amp;</span><span class="w"> </span><span class="n">array</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 96</span><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int64_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">rows_</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">());</span>
<span class="linenos"> 97</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 98</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">array</span><span class="p">.</span><span class="n">IsNull</span><span class="p">(</span><span class="n">i</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 99</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="nf">str_key</span><span class="p">(</span><span class="n">field_</span><span class="o">-&gt;</span><span class="n">name</span><span class="p">(),</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos">100</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string_view</span><span class="w"> </span><span class="n">value_view</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">Value</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="linenos">101</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="n">value</span><span class="p">;</span>
<span class="linenos">102</span><span class="w"> </span><span class="n">value</span><span class="p">.</span><span class="n">SetString</span><span class="p">(</span><span class="n">value_view</span><span class="p">.</span><span class="n">data</span><span class="p">(),</span>
<span class="linenos">103</span><span class="w"> </span><span class="k">static_cast</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">SizeType</span><span class="o">&gt;</span><span class="p">(</span><span class="n">value_view</span><span class="p">.</span><span class="n">size</span><span class="p">()),</span>
<span class="linenos">104</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos">105</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">AddMember</span><span class="p">(</span><span class="n">str_key</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos">106</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">107</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">108</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">109</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">110</span>
<span class="linenos">111</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">StructArray</span><span class="o">&amp;</span><span class="w"> </span><span class="n">array</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">112</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">StructType</span><span class="o">*</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">struct_type</span><span class="p">();</span>
<span class="linenos">113</span>
<span class="linenos">114</span><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int64_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">rows_</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">());</span>
<span class="linenos">115</span>
<span class="linenos">116</span><span class="w"> </span><span class="n">RowBatchBuilder</span><span class="w"> </span><span class="nf">child_builder</span><span class="p">(</span><span class="n">rows_</span><span class="p">.</span><span class="n">size</span><span class="p">());</span>
<span class="linenos">117</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">type</span><span class="o">-&gt;</span><span class="n">num_fields</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">118</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">*</span><span class="w"> </span><span class="n">child_field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type</span><span class="o">-&gt;</span><span class="n">field</span><span class="p">(</span><span class="n">i</span><span class="p">).</span><span class="n">get</span><span class="p">();</span>
<span class="linenos">119</span><span class="w"> </span><span class="n">child_builder</span><span class="p">.</span><span class="n">SetField</span><span class="p">(</span><span class="n">child_field</span><span class="p">);</span>
<span class="linenos">120</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">arrow</span><span class="o">::</span><span class="n">VisitArrayInline</span><span class="p">(</span><span class="o">*</span><span class="n">array</span><span class="p">.</span><span class="n">field</span><span class="p">(</span><span class="n">i</span><span class="p">).</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="o">&amp;</span><span class="n">child_builder</span><span class="p">));</span>
<span class="linenos">121</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">122</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;</span><span class="w"> </span><span class="n">rows</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">move</span><span class="p">(</span><span class="n">child_builder</span><span class="p">).</span><span class="n">Rows</span><span class="p">();</span>
<span class="linenos">123</span>
<span class="linenos">124</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">125</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">array</span><span class="p">.</span><span class="n">IsNull</span><span class="p">(</span><span class="n">i</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">126</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="nf">str_key</span><span class="p">(</span><span class="n">field_</span><span class="o">-&gt;</span><span class="n">name</span><span class="p">(),</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos">127</span><span class="w"> </span><span class="c1">// Must copy value to new allocator</span>
<span class="linenos">128</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="n">row_val</span><span class="p">;</span>
<span class="linenos">129</span><span class="w"> </span><span class="n">row_val</span><span class="p">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">rows</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos">130</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">AddMember</span><span class="p">(</span><span class="n">str_key</span><span class="p">,</span><span class="w"> </span><span class="n">row_val</span><span class="p">,</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">());</span>
<span class="linenos">131</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">132</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">133</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="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">134</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">135</span>
<span class="linenos">136</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">Visit</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">ListArray</span><span class="o">&amp;</span><span class="w"> </span><span class="n">array</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">137</span><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int64_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">rows_</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">());</span>
<span class="linenos">138</span><span class="w"> </span><span class="c1">// First create rows from values</span>
<span class="linenos">139</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">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">values</span><span class="p">();</span>
<span class="linenos">140</span><span class="w"> </span><span class="n">RowBatchBuilder</span><span class="w"> </span><span class="nf">child_builder</span><span class="p">(</span><span class="n">values</span><span class="o">-&gt;</span><span class="n">length</span><span class="p">());</span>
<span class="linenos">141</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">*</span><span class="w"> </span><span class="n">value_field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">list_type</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">value_field</span><span class="p">().</span><span class="n">get</span><span class="p">();</span>
<span class="linenos">142</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">value_field_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value_field</span><span class="o">-&gt;</span><span class="n">name</span><span class="p">();</span>
<span class="linenos">143</span><span class="w"> </span><span class="n">child_builder</span><span class="p">.</span><span class="n">SetField</span><span class="p">(</span><span class="n">value_field</span><span class="p">);</span>
<span class="linenos">144</span><span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">arrow</span><span class="o">::</span><span class="n">VisitArrayInline</span><span class="p">(</span><span class="o">*</span><span class="n">values</span><span class="p">.</span><span class="n">get</span><span class="p">(),</span><span class="w"> </span><span class="o">&amp;</span><span class="n">child_builder</span><span class="p">));</span>
<span class="linenos">145</span>
<span class="linenos">146</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;</span><span class="w"> </span><span class="n">rows</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">move</span><span class="p">(</span><span class="n">child_builder</span><span class="p">).</span><span class="n">Rows</span><span class="p">();</span>
<span class="linenos">147</span>
<span class="linenos">148</span><span class="w"> </span><span class="kt">int64_t</span><span class="w"> </span><span class="n">values_i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="linenos">149</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">length</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">150</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">array</span><span class="p">.</span><span class="n">IsNull</span><span class="p">(</span><span class="n">i</span><span class="p">))</span><span class="w"> </span><span class="k">continue</span><span class="p">;</span>
<span class="linenos">151</span>
<span class="linenos">152</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">::</span><span class="n">AllocatorType</span><span class="o">&amp;</span><span class="w"> </span><span class="n">allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">GetAllocator</span><span class="p">();</span>
<span class="linenos">153</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">array_len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">array</span><span class="p">.</span><span class="n">value_length</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="linenos">154</span>
<span class="linenos">155</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="n">value</span><span class="p">;</span>
<span class="linenos">156</span><span class="w"> </span><span class="n">value</span><span class="p">.</span><span class="n">SetArray</span><span class="p">();</span>
<span class="linenos">157</span><span class="w"> </span><span class="n">value</span><span class="p">.</span><span class="n">Reserve</span><span class="p">(</span><span class="n">array_len</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="p">);</span>
<span class="linenos">158</span>
<span class="linenos">159</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int64_t</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">array_len</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">j</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">160</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="n">row_val</span><span class="p">;</span>
<span class="linenos">161</span><span class="w"> </span><span class="c1">// Must copy value to new allocator</span>
<span class="linenos">162</span><span class="w"> </span><span class="n">row_val</span><span class="p">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">rows</span><span class="p">[</span><span class="n">values_i</span><span class="p">][</span><span class="n">value_field_name</span><span class="p">],</span><span class="w"> </span><span class="n">allocator</span><span class="p">);</span>
<span class="linenos">163</span><span class="w"> </span><span class="n">value</span><span class="p">.</span><span class="n">PushBack</span><span class="p">(</span><span class="n">row_val</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="p">);</span>
<span class="linenos">164</span><span class="w"> </span><span class="o">++</span><span class="n">values_i</span><span class="p">;</span>
<span class="linenos">165</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">166</span>
<span class="linenos">167</span><span class="w"> </span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Value</span><span class="w"> </span><span class="n">str_key</span><span class="p">(</span><span class="n">field_</span><span class="o">-&gt;</span><span class="n">name</span><span class="p">(),</span><span class="w"> </span><span class="n">allocator</span><span class="p">);</span>
<span class="linenos">168</span><span class="w"> </span><span class="n">rows_</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">AddMember</span><span class="p">(</span><span class="n">str_key</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="p">);</span>
<span class="linenos">169</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">170</span>
<span class="linenos">171</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">172</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">173</span>
<span class="linenos">174</span><span class="w"> </span><span class="k">private</span><span class="o">:</span>
<span class="linenos">175</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Field</span><span class="o">*</span><span class="w"> </span><span class="n">field_</span><span class="p">;</span>
<span class="linenos">176</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">rapidjson</span><span class="o">::</span><span class="n">Document</span><span class="o">&gt;</span><span class="w"> </span><span class="n">rows_</span><span class="p">;</span>
<span class="linenos">177</span><span class="p">};</span><span class="w"> </span><span class="c1">// RowBatchBuilder</span>
</pre></div>
</div>
</section>
</section>
</section>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
<a class="left-prev"
href="dataset_skyhook_scan_example.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
<p class="prev-next-title">Arrow Skyhook example</p>
</div>
</a>
<a class="right-next"
href="tuple_range_conversion.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
<p class="prev-next-title">Conversion of range of <code class="docutils literal notranslate"><span class="pre">std::tuple</span></code>-like to <code class="docutils literal notranslate"><span class="pre">Table</span></code> instances</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="#fixed-schemas">Fixed Schemas</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#dynamic-schemas">Dynamic Schemas</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#writing-conversions-to-arrow">Writing conversions to Arrow</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#writing-conversions-from-arrow">Writing conversions from Arrow</a></li>
</ul>
</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/examples/row_columnar_conversion.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>