blob: 5fd7f84177350672de84a600868b74d7cea33aa6 [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="viewport" content="width=device-width, initial-scale=1" />
<title>Working with the C++ Implementation &#8212; Apache Arrow C++ Cookbook documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d1102ebc" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=49eeb2a1" />
<script src="_static/documentation_options.js?v=5929fcd5"></script>
<script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<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="Creating Arrow Objects" href="create.html" />
<link rel="prev" title="Apache Arrow C++ Cookbook" href="index.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<!-- 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>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="working-with-the-c-implementation">
<h1><a class="toc-backref" href="#id7" role="doc-backlink">Working with the C++ Implementation</a><a class="headerlink" href="#working-with-the-c-implementation" title="Link to this heading"></a></h1>
<p>This section of the cookbook goes over basic concepts
that will be needed regardless of how you intend to use
the Arrow C++ implementation.</p>
<nav class="contents" id="contents">
<p class="topic-title">Contents</p>
<ul class="simple">
<li><p><a class="reference internal" href="#working-with-the-c-implementation" id="id7">Working with the C++ Implementation</a></p>
<ul>
<li><p><a class="reference internal" href="#working-with-status-and-result" id="id8">Working with Status and Result</a></p></li>
<li><p><a class="reference internal" href="#using-the-visitor-pattern" id="id9">Using the Visitor Pattern</a></p>
<ul>
<li><p><a class="reference internal" href="#generate-random-data" id="id10">Generate Random Data</a></p></li>
<li><p><a class="reference internal" href="#generalize-computations-across-arrow-types" id="id11">Generalize Computations Across Arrow Types</a></p></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
<section id="working-with-status-and-result">
<h2><a class="toc-backref" href="#id8" role="doc-backlink">Working with Status and Result</a><a class="headerlink" href="#working-with-status-and-result" title="Link to this heading"></a></h2>
<p>C++ libraries often have to choose between throwing exceptions and
returning error codes. Arrow chooses to return Status and Result
objects as a middle ground. This makes it clear when a function
can fail and is easier to use than integer arrow codes.</p>
<p>It is important to always check the value of a returned Status object to
ensure that the operation succeeded. However, this can quickly become
tedious:</p>
<div class="literal-block-wrapper docutils container" id="id1">
<div class="code-block-caption"><span class="caption-text">Checking the status of every function manually</span><a class="headerlink" href="#id1" title="Link to this code"></a></div>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="p">()</span><span class="o">&gt;</span><span class="w"> </span><span class="n">test_fn</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="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">NullBuilder</span><span class="w"> </span><span class="n">builder</span><span class="p">;</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Reserve</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// Tedious return value check</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">st</span><span class="p">.</span><span class="n">ok</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">st</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">AppendNulls</span><span class="p">(</span><span class="mi">-1</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// Tedious return value check</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">st</span><span class="p">.</span><span class="n">ok</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">st</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">rout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Appended -1 null values?&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">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="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">test_fn</span><span class="p">();</span>
<span class="n">rout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</pre></div>
</div>
</div>
<div class="literal-block-wrapper docutils container" id="id2">
<div class="code-block-caption"><span class="caption-text">Code Output</span><a class="headerlink" href="#id2" title="Link to this code"></a></div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Invalid</span><span class="p">:</span> <span class="n">length</span> <span class="n">must</span> <span class="n">be</span> <span class="n">positive</span>
</pre></div>
</div>
</div>
<p>The macro <a class="reference external" href="https://arrow.apache.org/docs/cpp/api/support.html#c.ARROW_RETURN_NOT_OK" title="(in Apache Arrow v15.0.1)"><code class="xref c c-macro docutils literal notranslate"><span class="pre">ARROW_RETURN_NOT_OK</span></code></a> will take care of some of this
boilerplate for you. It will run the contained expression and check the resulting
<code class="docutils literal notranslate"><span class="pre">Status</span></code> or <code class="docutils literal notranslate"><span class="pre">Result</span></code> object. If it failed then it will return the failure.</p>
<div class="literal-block-wrapper docutils container" id="id3">
<div class="code-block-caption"><span class="caption-text">Using ARROW_RETURN_NOT_OK to check the status</span><a class="headerlink" href="#id3" title="Link to this code"></a></div>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="p">()</span><span class="o">&gt;</span><span class="w"> </span><span class="n">test_fn</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="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">NullBuilder</span><span class="w"> </span><span class="n">builder</span><span class="p">;</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="p">.</span><span class="n">Reserve</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span>
<span class="w"> </span><span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">builder</span><span class="p">.</span><span class="n">AppendNulls</span><span class="p">(</span><span class="mi">-1</span><span class="p">));</span>
<span class="w"> </span><span class="n">rout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Appended -1 null values?&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">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="n">arrow</span><span class="o">::</span><span class="n">Status</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">test_fn</span><span class="p">();</span>
<span class="n">rout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">st</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</pre></div>
</div>
</div>
<div class="literal-block-wrapper docutils container" id="id4">
<div class="code-block-caption"><span class="caption-text">Code Output</span><a class="headerlink" href="#id4" title="Link to this code"></a></div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Invalid</span><span class="p">:</span> <span class="n">length</span> <span class="n">must</span> <span class="n">be</span> <span class="n">positive</span>
</pre></div>
</div>
</div>
</section>
<section id="using-the-visitor-pattern">
<h2><a class="toc-backref" href="#id9" role="doc-backlink">Using the Visitor Pattern</a><a class="headerlink" href="#using-the-visitor-pattern" title="Link to this heading"></a></h2>
<p>Arrow classes <a class="reference external" href="https://arrow.apache.org/docs/cpp/api/datatype.html#_CPPv4N5arrow8DataTypeE" title="(in Apache Arrow v15.0.1)"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::DataType</span></code></a>, <a class="reference external" href="https://arrow.apache.org/docs/cpp/api/scalar.html#_CPPv4N5arrow6ScalarE" title="(in Apache Arrow v15.0.1)"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::Scalar</span></code></a>, and
<a class="reference external" href="https://arrow.apache.org/docs/cpp/api/array.html#_CPPv4N5arrow5ArrayE" title="(in Apache Arrow v15.0.1)"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">arrow::Array</span></code></a> have specialized subclasses for each Arrow type. In
order to specialize logic for each subclass, you can use the visitor pattern.
Arrow provides inline template functions that allow you to call visitors
efficiently:</p>
<blockquote>
<div><ul class="simple">
<li><p><a class="reference external" href="https://arrow.apache.org/docs/cpp/api/utilities.html#_CPPv4I0DpEN5arrow15VisitTypeInlineE6StatusRK8DataTypeP7VISITORDpRR4ARGS" title="(in Apache Arrow v15.0.1)"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">arrow::VisitTypeInline()</span></code></a></p></li>
<li><p><a class="reference external" href="https://arrow.apache.org/docs/cpp/api/utilities.html#_CPPv4I0DpEN5arrow17VisitScalarInlineE6StatusRK6ScalarP7VISITORDpRR4ARGS" title="(in Apache Arrow v15.0.1)"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">arrow::VisitScalarInline()</span></code></a></p></li>
<li><p><a class="reference external" href="https://arrow.apache.org/docs/cpp/api/utilities.html#_CPPv4I0DpEN5arrow16VisitArrayInlineE6StatusRK5ArrayP7VISITORDpRR4ARGS" title="(in Apache Arrow v15.0.1)"><code class="xref cpp cpp-func docutils literal notranslate"><span class="pre">arrow::VisitArrayInline()</span></code></a></p></li>
</ul>
</div></blockquote>
<section id="generate-random-data">
<h3><a class="toc-backref" href="#id10" role="doc-backlink">Generate Random Data</a><a class="headerlink" href="#generate-random-data" title="Link to this heading"></a></h3>
<p>See example at <a class="reference internal" href="create.html#generate-random-data-example"><span class="std std-ref">Generate Random Data for a Given Schema</span></a>.</p>
</section>
<section id="generalize-computations-across-arrow-types">
<h3><a class="toc-backref" href="#id11" role="doc-backlink">Generalize Computations Across Arrow Types</a><a class="headerlink" href="#generalize-computations-across-arrow-types" title="Link to this heading"></a></h3>
<p>Array visitors can be useful when writing functions that can handle multiple
array types. However, implementing a visitor for each type individually can be
excessively verbose. Fortunately, Arrow provides type traits that allow you to
write templated functions to handle subsets of types. The example below
demonstrates a table sum function that can handle any integer or floating point
array with only a single visitor implementation by leveraging
<code class="xref cpp cpp-type docutils literal notranslate"><span class="pre">arrow::enable_if_number</span></code>.</p>
<div class="literal-block-wrapper docutils container" id="id5">
<div class="code-block-caption"><span class="caption-text">Using visitor pattern that can compute sum of table with any numeric type</span><a class="headerlink" href="#id5" title="Link to this code"></a></div>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="k">class</span><span class="w"> </span><span class="nc">TableSummation</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 2</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">partial</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.0</span><span class="p">;</span>
<span class="linenos"> 3</span><span class="w"> </span><span class="k">public</span><span class="o">:</span>
<span class="linenos"> 4</span>
<span class="linenos"> 5</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="kt">double</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Compute</span><span class="p">(</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"> 6</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</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">array</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">batch</span><span class="o">-&gt;</span><span class="n">columns</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 7</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="w"> </span><span class="k">this</span><span class="p">));</span>
<span class="linenos"> 8</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 9</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">partial</span><span class="p">;</span>
<span class="linenos">10</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">11</span>
<span class="linenos">12</span><span class="w"> </span><span class="c1">// Default implementation</span>
<span class="linenos">13</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">14</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="s">&quot;Can not compute sum for array of type &quot;</span><span class="p">,</span>
<span class="linenos">15</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">16</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">17</span>
<span class="linenos">18</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">T</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">19</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">enable_if_number</span><span class="o">&lt;</span><span class="n">T</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="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">20</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o">&lt;</span><span class="k">typename</span><span class="w"> </span><span class="nc">T</span><span class="o">::</span><span class="n">c_type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">:</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">21</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="p">.</span><span class="n">has_value</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">22</span><span class="w"> </span><span class="n">partial</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="kt">double</span><span class="o">&gt;</span><span class="p">(</span><span class="n">value</span><span class="p">.</span><span class="n">value</span><span class="p">());</span>
<span class="linenos">23</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">24</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">25</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">26</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">27</span><span class="p">};</span><span class="w"> </span><span class="c1">// TableSummation</span>
</pre></div>
</div>
</div>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></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="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">schema</span><span class="p">({</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">field</span><span class="p">(</span><span class="s">&quot;a&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">int32</span><span class="p">()),</span>
<span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">field</span><span class="p">(</span><span class="s">&quot;b&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">float64</span><span class="p">()),</span>
<span class="p">});</span>
<span class="kt">int32_t</span><span class="w"> </span><span class="n">num_rows</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</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">Array</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">columns</span><span class="p">;</span>
<span class="n">arrow</span><span class="o">::</span><span class="n">Int32Builder</span><span class="w"> </span><span class="n">a_builder</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">Int32Builder</span><span class="p">();</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="o">&gt;</span><span class="w"> </span><span class="n">a_vals</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">};</span>
<span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">a_builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">a_vals</span><span class="p">));</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">a_arr</span><span class="p">,</span><span class="w"> </span><span class="n">a_builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="n">columns</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">a_arr</span><span class="p">);</span>
<span class="n">arrow</span><span class="o">::</span><span class="n">DoubleBuilder</span><span class="w"> </span><span class="n">b_builder</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">DoubleBuilder</span><span class="p">();</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">b_vals</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="mf">4.0</span><span class="p">,</span><span class="w"> </span><span class="mf">5.0</span><span class="p">,</span><span class="w"> </span><span class="mf">6.0</span><span class="p">};</span>
<span class="n">ARROW_RETURN_NOT_OK</span><span class="p">(</span><span class="n">b_builder</span><span class="p">.</span><span class="n">AppendValues</span><span class="p">(</span><span class="n">b_vals</span><span class="p">));</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">b_arr</span><span class="p">,</span><span class="w"> </span><span class="n">b_builder</span><span class="p">.</span><span class="n">Finish</span><span class="p">());</span>
<span class="n">columns</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">b_arr</span><span class="p">);</span>
<span class="k">auto</span><span class="w"> </span><span class="n">batch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="o">::</span><span class="n">RecordBatch</span><span class="o">::</span><span class="n">Make</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span><span class="w"> </span><span class="n">num_rows</span><span class="p">,</span><span class="w"> </span><span class="n">columns</span><span class="p">);</span>
<span class="c1">// Call</span>
<span class="n">TableSummation</span><span class="w"> </span><span class="n">summation</span><span class="p">;</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">total</span><span class="p">,</span><span class="w"> </span><span class="n">summation</span><span class="p">.</span><span class="n">Compute</span><span class="p">(</span><span class="n">batch</span><span class="p">));</span>
<span class="n">rout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;Total is &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">total</span><span class="p">;</span>
</pre></div>
</div>
<div class="literal-block-wrapper docutils container" id="id6">
<div class="code-block-caption"><span class="caption-text">Code Output</span><a class="headerlink" href="#id6" title="Link to this code"></a></div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Total</span> <span class="ow">is</span> <span class="mi">21</span>
</pre></div>
</div>
</div>
</section>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo">
<a href="index.html">
<img class="logo" src="_static/arrow-logo_vertical_black-txt_transparent-bg.svg" alt="Logo" />
</a>
</p>
<p>
<iframe src="https://ghbtns.com/github-btn.html?user=apache&repo=arrow-cookbook&type=none&count=true&size=large&v=2"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
<h3>Navigation</h3>
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Working with the C++ Implementation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#working-with-status-and-result">Working with Status and Result</a></li>
<li class="toctree-l2"><a class="reference internal" href="#using-the-visitor-pattern">Using the Visitor Pattern</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="create.html">Creating Arrow Objects</a></li>
<li class="toctree-l1"><a class="reference internal" href="datasets.html">Reading and Writing Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight.html">Arrow Flight</a></li>
</ul>
<hr />
<ul>
<li class="toctree-l1"><a href="https://arrow.apache.org/docs/cpp/index.html">User Guide</a></li>
<li class="toctree-l1"><a href="https://arrow.apache.org/docs/cpp/api.html">API Reference</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="index.html" title="previous chapter">Apache Arrow C++ Cookbook</a></li>
<li>Next: <a href="create.html" title="next chapter">Creating Arrow Objects</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>document.getElementById('searchbox').style.display = "block"</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&#169;2022, Apache Software Foundation.
|
Powered by <a href="https://www.sphinx-doc.org/">Sphinx 7.2.6</a>
&amp; <a href="https://alabaster.readthedocs.io">Alabaster 0.7.16</a>
|
<a href="_sources/basic.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>