You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@samza.apache.org by aj...@apache.org on 2023/01/18 19:33:31 UTC

svn commit: r1906774 [26/49] - in /samza/site: ./ archive/ blog/ case-studies/ community/ contribute/ img/latest/learn/documentation/api/ learn/documentation/latest/ learn/documentation/latest/api/ learn/documentation/latest/api/javadocs/ learn/documen...

Modified: samza/site/learn/documentation/latest/api/table-api.html
URL: http://svn.apache.org/viewvc/samza/site/learn/documentation/latest/api/table-api.html?rev=1906774&r1=1906773&r2=1906774&view=diff
==============================================================================
--- samza/site/learn/documentation/latest/api/table-api.html (original)
+++ samza/site/learn/documentation/latest/api/table-api.html Wed Jan 18 19:33:25 2023
@@ -227,6 +227,12 @@
     
       
         
+      <a class="side-navigation__group-item" data-match-active="" href="/releases/1.8.0">1.8.0</a>
+      
+        
+      <a class="side-navigation__group-item" data-match-active="" href="/releases/1.7.0">1.7.0</a>
+      
+        
       <a class="side-navigation__group-item" data-match-active="" href="/releases/1.6.0">1.6.0</a>
       
         
@@ -538,6 +544,14 @@
               
               
 
+              <li class="hide"><a href="/learn/documentation/1.8.0/api/table-api">1.8.0</a></li>
+
+              
+
+              <li class="hide"><a href="/learn/documentation/1.7.0/api/table-api">1.7.0</a></li>
+
+              
+
               <li class="hide"><a href="/learn/documentation/1.6.0/api/table-api">1.6.0</a></li>
 
               
@@ -643,7 +657,7 @@
 
 <p>Samza Table API is an abstraction for data sources that support random 
 access by key, which simplifies stream-table-join. It is the natural 
-evolution of the existing <a href="https://github.com/apache/samza/blob/master/samza-kv/src/main/scala/org/apache/samza/storage/kv/KeyValueStorageEngine.scala">storage API</a>, 
+evolution of the existing [storage API] (https://github.com/apache/samza/blob/master/samza-kv/src/main/scala/org/apache/samza/storage/kv/KeyValueStorageEngine.scala), 
 and it offers support for both local and remote data sources and 
 composition through hybrid tables.</p>
 
@@ -673,109 +687,109 @@ which are all encapsulated under the Sam
 <h1 id="sample-applications">Sample Applications</h1>
 
 <p>Sample applications demonstrating how to use Samza Table API can be found 
-<a href="https://github.com/apache/samza-hello-samza/tree/latest/src/main/java/samza/examples/cookbook">here</a>.</p>
+[here] (https://github.com/apache/samza-hello-samza/tree/latest/src/main/java/samza/examples/cookbook).</p>
 
 <h1 id="architecture-and-concepts">Architecture and Concepts</h1>
 
-<p>The diagram below illustrates the overall architecture of Samza Table API. </p>
+<p>The diagram below illustrates the overall architecture of Samza Table API.</p>
 
-<p><img src="/img/latest/learn/documentation/api/table-api-arch.svg" alt="diagram-medium"></p>
+<p><img src="/img/latest/learn/documentation/api/table-api-arch.svg" alt="diagram-medium" /></p>
 
 <p>Let’s look at a few concepts before diving into the API.</p>
 
-<p><img src="/img/latest/learn/documentation/api/table-class-diagram.svg" alt="diagram-medium"></p>
+<p><img src="/img/latest/learn/documentation/api/table-api-class-diagram.png" alt="diagram-medium" /></p>
 
-<p><a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/Table.java"><code>Table</code></a> - 
+<p>[<code class="language-plaintext highlighter-rouge">Table</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/Table.java) - 
 This interface represents a dataset that can be accessed by key. We support 
-two types of tables: read-only and read-write. A table can be accessed either 
+gets, put, updates and deletes. A table can be accessed either 
 synchronously or asynchronously and a request may contain one or more keys. 
 There are three broad categories of tables: local, remote and hybrid.</p>
 
-<p><a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/ReadableTable.java"><code>ReadableTable</code></a> - 
-Interface that represents a read-only table. It implements Table.</p>
+<p>[<code class="language-plaintext highlighter-rouge">AsyncReadWriteUpdateTable</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/AsyncReadWriteUpdateTable.java) -
+Interface that represents a read-write-update table with asynchronous operations. Core interface for all table implementations.</p>
 
-<p><a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/ReadWriteTable.java"><code>ReadWriteTable</code></a> - 
-Interface that represents a read-write table. It implements Table.</p>
+<p>[<code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/ReadWriteUpdateTable.java) - 
+Interface that represents a read-write-update table. It implements AsyncReadWriteUpdateTable. Supports synchronous operations as well.</p>
 
-<p><a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/operators/TableDescriptor.java"><code>TableDescriptor</code></a> - 
+<p>[<code class="language-plaintext highlighter-rouge">TableDescriptor</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/operators/TableDescriptor.java) - 
 User-facing object that contains metadata that completely describes a table. 
 It may include identifier, serialization, provider, configuration, etc. 
 Example implementations of this interface are</p>
 
 <ul>
-<li><a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code>RemoteTableDescriptor</code></a> 
-facilitates access to remotely stored data, </li>
-<li><a href="https://github.com/apache/samza/blob/master/samza-kv-inmemory/src/main/java/org/apache/samza/storage/kv/inmemory/InMemoryTableDescriptor.java"><code>InMemoryTableDescriptor</code></a> 
-describes a table stored in-memory, and </li>
-<li><a href="https://github.com/apache/samza/blob/master/samza-kv-rocksdb/src/main/java/org/apache/samza/storage/kv/RocksDbTableDescriptor.java"><code>RocksDbTableDescriptor</code></a> 
-describes a table stored in RocksDB.</li>
+  <li>[<code class="language-plaintext highlighter-rouge">RemoteTableDescriptor</code>] (https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java) 
+ facilitates access to remotely stored data,</li>
+  <li>[<code class="language-plaintext highlighter-rouge">InMemoryTableDescriptor</code>] (https://github.com/apache/samza/blob/master/samza-kv-inmemory/src/main/java/org/apache/samza/storage/kv/inmemory/InMemoryTableDescriptor.java) 
+ describes a table stored in-memory, and</li>
+  <li>[<code class="language-plaintext highlighter-rouge">RocksDbTableDescriptor</code>] (https://github.com/apache/samza/blob/master/samza-kv-rocksdb/src/main/java/org/apache/samza/storage/kv/RocksDbTableDescriptor.java) 
+ describes a table stored in RocksDB.</li>
 </ul>
 
 <h1 id="table-sync-and-async-api">Table Sync and Async API</h1>
 
 <p>Samza Table supports both synchronous and asynchronous API. Below is an example for 
-the <strong><code>get</code></strong> operation.</p>
+the <strong><code class="language-plaintext highlighter-rouge">get</code></strong> operation.</p>
 
-<figure class="highlight"><pre><code class="language-java" data-lang="java"><span></span>  <span class="cm">/**</span>
-<span class="cm">   * Gets the value associated with the specified {@code key}.</span>
-<span class="cm">   *</span>
-<span class="cm">   * @param key the key with which the associated value is to be fetched.</span>
-<span class="cm">   * @param args additional arguments</span>
-<span class="cm">   * @return if found, the value associated with the specified {@code key}; otherwise, {@code null}.</span>
-<span class="cm">   * @throws NullPointerException if the specified {@code key} is {@code null}.</span>
-<span class="cm">   */</span>
-  <span class="n">V</span> <span class="nf">get</span><span class="o">(</span><span class="n">K</span> <span class="n">key</span><span class="o">,</span> <span class="n">Object</span> <span class="o">...</span> <span class="n">args</span><span class="o">);</span>
-
-  <span class="cm">/**</span>
-<span class="cm">   * Asynchronously gets the value associated with the specified {@code key}.</span>
-<span class="cm">   *</span>
-<span class="cm">   * @param key the key with which the associated value is to be fetched.</span>
-<span class="cm">   * @param args additional arguments</span>
-<span class="cm">   * @return completableFuture for the requested value</span>
-<span class="cm">   * @throws NullPointerException if the specified {@code key} is {@code null}.</span>
-<span class="cm">   */</span>
-  <span class="n">CompletableFuture</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;</span> <span class="nf">getAsync</span><span class="o">(</span><span class="n">K</span> <span class="n">key</span><span class="o">,</span> <span class="n">Object</span> <span class="o">...</span> <span class="n">args</span><span class="o">);</span></code></pre></figure>
+<figure class="highlight"><pre><code class="language-java" data-lang="java">  <span class="cm">/**
+   * Gets the value associated with the specified {@code key}.
+   *
+   * @param key the key with which the associated value is to be fetched.
+   * @param args additional arguments
+   * @return if found, the value associated with the specified {@code key}; otherwise, {@code null}.
+   * @throws NullPointerException if the specified {@code key} is {@code null}.
+   */</span>
+  <span class="no">V</span> <span class="nf">get</span><span class="o">(</span><span class="no">K</span> <span class="n">key</span><span class="o">,</span> <span class="nc">Object</span> <span class="o">...</span> <span class="n">args</span><span class="o">);</span>
+
+  <span class="cm">/**
+   * Asynchronously gets the value associated with the specified {@code key}.
+   *
+   * @param key the key with which the associated value is to be fetched.
+   * @param args additional arguments
+   * @return completableFuture for the requested value
+   * @throws NullPointerException if the specified {@code key} is {@code null}.
+   */</span>
+  <span class="nc">CompletableFuture</span><span class="o">&lt;</span><span class="no">V</span><span class="o">&gt;</span> <span class="nf">getAsync</span><span class="o">(</span><span class="no">K</span> <span class="n">key</span><span class="o">,</span> <span class="nc">Object</span> <span class="o">...</span> <span class="n">args</span><span class="o">);</span></code></pre></figure>
 
 <h1 id="using-table-with-samza-high-level-api">Using Table with Samza High Level API</h1>
 
 <p>The code snippet below illustrates the usage of table in Samza high level API.</p>
 
-<figure class="highlight"><pre><code class="language-java" data-lang="java"><span></span> <span class="mi">1</span>  <span class="kd">class</span> <span class="nc">SamzaStreamApplication</span> <span class="kd">implements</span> <span class="n">StreamApplication</span> <span class="o">{</span>
+<figure class="highlight"><pre><code class="language-java" data-lang="java"> <span class="mi">1</span>  <span class="kd">class</span> <span class="nc">SamzaStreamApplication</span> <span class="kd">implements</span> <span class="nc">StreamApplication</span> <span class="o">{</span>
  <span class="mi">2</span>    <span class="nd">@Override</span>
- <span class="mi">3</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">describe</span><span class="o">(</span><span class="n">StreamApplicationDescriptor</span> <span class="n">appDesc</span><span class="o">)</span> <span class="o">{</span>
- <span class="mi">4</span>      <span class="n">TableDescriptor</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">desc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InMemoryTableDescriptor</span><span class="o">(</span>
- <span class="mi">5</span>          <span class="s">&quot;t1&quot;</span><span class="o">,</span> <span class="n">KVSerde</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">IntegerSerde</span><span class="o">(),</span> <span class="k">new</span> <span class="n">ProfileJsonSerde</span><span class="o">()));</span>
+ <span class="mi">3</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">describe</span><span class="o">(</span><span class="nc">StreamApplicationDescriptor</span> <span class="n">appDesc</span><span class="o">)</span> <span class="o">{</span>
+ <span class="mi">4</span>      <span class="nc">TableDescriptor</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">desc</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InMemoryTableDescriptor</span><span class="o">(</span>
+ <span class="mi">5</span>          <span class="s">"t1"</span><span class="o">,</span> <span class="nc">KVSerde</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">IntegerSerde</span><span class="o">(),</span> <span class="k">new</span> <span class="nc">ProfileJsonSerde</span><span class="o">()));</span>
  <span class="mi">6</span> 
- <span class="mi">7</span>      <span class="n">Table</span><span class="o">&lt;</span><span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;&gt;</span> <span class="n">table</span> <span class="o">=</span> <span class="n">appDesc</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="n">desc</span><span class="o">);</span>
+ <span class="mi">7</span>      <span class="nc">Table</span><span class="o">&lt;</span><span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;&gt;</span> <span class="n">table</span> <span class="o">=</span> <span class="n">appDesc</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="n">desc</span><span class="o">);</span>
  <span class="mi">8</span> 
- <span class="mi">9</span>      <span class="n">appDesc</span><span class="o">.</span><span class="na">getInputStream</span><span class="o">(</span><span class="s">&quot;PageView&quot;</span><span class="o">,</span> <span class="k">new</span> <span class="n">NoOpSerde</span><span class="o">&lt;</span><span class="n">PageView</span><span class="o">&gt;())</span>
-<span class="mi">10</span>          <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="k">new</span> <span class="n">MyMapFunc</span><span class="o">())</span>
-<span class="mi">11</span>          <span class="o">.</span><span class="na">join</span><span class="o">(</span><span class="n">table</span><span class="o">,</span> <span class="k">new</span> <span class="n">MyJoinFunc</span><span class="o">())</span>
+ <span class="mi">9</span>      <span class="n">appDesc</span><span class="o">.</span><span class="na">getInputStream</span><span class="o">(</span><span class="s">"PageView"</span><span class="o">,</span> <span class="k">new</span> <span class="nc">NoOpSerde</span><span class="o">&lt;</span><span class="nc">PageView</span><span class="o">&gt;())</span>
+<span class="mi">10</span>          <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="k">new</span> <span class="nc">MyMapFunc</span><span class="o">())</span>
+<span class="mi">11</span>          <span class="o">.</span><span class="na">join</span><span class="o">(</span><span class="n">table</span><span class="o">,</span> <span class="k">new</span> <span class="nc">MyJoinFunc</span><span class="o">())</span>
 <span class="mi">12</span>          <span class="o">.</span><span class="na">sendTo</span><span class="o">(</span><span class="n">anotherTable</span><span class="o">);</span>
 <span class="mi">13</span>    <span class="o">}</span>
 <span class="mi">14</span>  <span class="o">}</span>
 <span class="mi">15</span>
-<span class="mi">16</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyMapFunc</span> <span class="kd">implements</span> <span class="n">MapFunction</span><span class="o">&lt;</span><span class="n">PageView</span><span class="o">,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;&gt;</span> <span class="o">{</span>
-<span class="mi">17</span>    <span class="kd">private</span> <span class="n">ReadableTable</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">profileTable</span><span class="o">;</span>
+<span class="mi">16</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyMapFunc</span> <span class="kd">implements</span> <span class="nc">MapFunction</span><span class="o">&lt;</span><span class="nc">PageView</span><span class="o">,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;&gt;</span> <span class="o">{</span>
+<span class="mi">17</span>    <span class="kd">private</span> <span class="nc">ReadWriteUpdateTable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">profileTable</span><span class="o">;</span>
 <span class="mi">18</span>
 <span class="mi">19</span>    <span class="nd">@Override</span>
-<span class="mi">20</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Config</span> <span class="n">config</span><span class="o">,</span> <span class="n">TaskContext</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
-<span class="mi">21</span>      <span class="n">profileTable</span> <span class="o">=</span> <span class="o">(</span><span class="n">ReadableTable</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;)</span> <span class="n">context</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="s">&quot;t1&quot;</span><span class="o">);</span>
+<span class="mi">20</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="nc">Config</span> <span class="n">config</span><span class="o">,</span> <span class="nc">TaskContext</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">21</span>      <span class="n">profileTable</span> <span class="o">=</span> <span class="o">(</span><span class="nc">ReadWriteUpdateTable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;)</span> <span class="n">context</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="s">"t1"</span><span class="o">);</span>
 <span class="mi">22</span>    <span class="o">}</span>
 <span class="mi">23</span> 
 <span class="mi">24</span>    <span class="nd">@Override</span>
-<span class="mi">25</span>    <span class="kd">public</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;</span> <span class="nf">apply</span><span class="o">(</span><span class="n">PageView</span> <span class="n">message</span><span class="o">)</span> <span class="o">{</span>
-<span class="mi">26</span>      <span class="k">return</span> <span class="k">new</span> <span class="n">KV</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">message</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">message</span><span class="o">);</span>
+<span class="mi">25</span>    <span class="kd">public</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;</span> <span class="nf">apply</span><span class="o">(</span><span class="nc">PageView</span> <span class="n">message</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">26</span>      <span class="k">return</span> <span class="k">new</span> <span class="no">KV</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">message</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">message</span><span class="o">);</span>
 <span class="mi">27</span>    <span class="o">}</span>
 <span class="mi">28</span>  <span class="o">}</span>
 <span class="mi">29</span>
-<span class="mi">30</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyJoinFunc</span> <span class="kd">implements</span> <span class="n">StreamTableJoinFunction</span>
-<span class="mi">31</span>      <span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;,</span> <span class="n">EnrichedPageView</span><span class="o">&gt;</span> <span class="o">{</span>
+<span class="mi">30</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyJoinFunc</span> <span class="kd">implements</span> <span class="nc">StreamTableJoinFunction</span>
+<span class="mi">31</span>      <span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;,</span> <span class="nc">EnrichedPageView</span><span class="o">&gt;</span> <span class="o">{</span>
 <span class="mi">32</span>
 <span class="mi">33</span>    <span class="nd">@Override</span>
-<span class="mi">34</span>    <span class="kd">public</span> <span class="n">EnrichedPageView</span> <span class="nf">apply</span><span class="o">(</span><span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;</span> <span class="n">m</span><span class="o">,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">34</span>    <span class="kd">public</span> <span class="nc">EnrichedPageView</span> <span class="nf">apply</span><span class="o">(</span><span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;</span> <span class="n">m</span><span class="o">,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
 <span class="mi">35</span>      <span class="n">counterPerJoinFn</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">currentSeqNo</span><span class="o">).</span><span class="na">incrementAndGet</span><span class="o">();</span>
-<span class="mi">36</span>        <span class="k">return</span> <span class="n">r</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kc">null</span> <span class="o">:</span> <span class="k">new</span> <span class="n">EnrichedPageView</span><span class="o">(</span>
+<span class="mi">36</span>        <span class="k">return</span> <span class="n">r</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kc">null</span> <span class="o">:</span> <span class="k">new</span> <span class="nc">EnrichedPageView</span><span class="o">(</span>
 <span class="mi">37</span>            <span class="n">m</span><span class="o">.</span><span class="na">getValue</span><span class="o">().</span><span class="na">getPageKey</span><span class="o">(),</span> <span class="n">m</span><span class="o">.</span><span class="na">getKey</span><span class="o">(),</span> <span class="n">r</span><span class="o">.</span><span class="na">getValue</span><span class="o">().</span><span class="na">getCompany</span><span class="o">());</span>
 <span class="mi">38</span>    <span class="o">}</span>
 <span class="mi">39</span>  <span class="o">}</span></code></pre></figure>
@@ -784,107 +798,109 @@ the <strong><code>get</code></strong> op
 join with a table and finally write the output to another table.</p>
 
 <ol>
-<li>Line 4-5: A <code>TableDescriptor</code> for an in-memory table is created, and then 
-the serde is set. </li>
-<li>Line 7: A table object is created from the <code>TableDescriptor</code>; internally, 
-the <code>TableDescriptor</code> is converted to a <code>TableSpec</code>, and registered with the 
-<code>TaskApplicationDescriptor</code>. The table object has a reference to the <code>TableSpec</code>.</li>
-<li>Line 9: creates an <code>InputStream</code></li>
-<li>Line 10: applies a map operator defined in line 16-28, all table instances 
-can be accessed from the task context in <code>Task.init()</code>. In this example, 
+  <li>Line 4-5: A <code class="language-plaintext highlighter-rouge">TableDescriptor</code> for an in-memory table is created, and then 
+the serde is set.</li>
+  <li>Line 7: A table object is created from the <code class="language-plaintext highlighter-rouge">TableDescriptor</code>; internally, 
+the <code class="language-plaintext highlighter-rouge">TableDescriptor</code> is converted to a <code class="language-plaintext highlighter-rouge">TableSpec</code>, and registered with the 
+<code class="language-plaintext highlighter-rouge">TaskApplicationDescriptor</code>. The table object has a reference to the <code class="language-plaintext highlighter-rouge">TableSpec</code>.</li>
+  <li>Line 9: creates an <code class="language-plaintext highlighter-rouge">InputStream</code></li>
+  <li>Line 10: applies a map operator defined in line 16-28, all table instances 
+can be accessed from the task context in <code class="language-plaintext highlighter-rouge">Task.init()</code>. In this example, 
 it is stored in a local variable.</li>
-<li>Line 11: joins the mapped stream with the table using the supplied join 
+  <li>Line 11: joins the mapped stream with the table using the supplied join 
 function defined in lines 30-39.</li>
-<li>Line 12: writes the join result stream to another table</li>
+  <li>Line 12: writes the join result stream to another table</li>
 </ol>
 
 <h1 id="using-table-with-samza-high-level-api-using-side-inputs">Using Table with Samza High Level API using Side Inputs</h1>
 
 <p>The code snippet below illustrates the usage of table in Samza high level API using side inputs.</p>
 
-<figure class="highlight"><pre><code class="language-java" data-lang="java"><span></span> <span class="mi">1</span>  <span class="kd">class</span> <span class="nc">SamzaStreamApplication</span> <span class="kd">implements</span> <span class="n">StreamApplication</span> <span class="o">{</span>
+<figure class="highlight"><pre><code class="language-java" data-lang="java"> <span class="mi">1</span>  <span class="kd">class</span> <span class="nc">SamzaStreamApplication</span> <span class="kd">implements</span> <span class="nc">StreamApplication</span> <span class="o">{</span>
  <span class="mi">2</span>    <span class="nd">@Override</span>
- <span class="mi">3</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">describe</span><span class="o">(</span><span class="n">StreamApplicationDescriptor</span> <span class="n">appDesc</span><span class="o">)</span> <span class="o">{</span>
- <span class="mi">4</span>      <span class="n">TableDescriptor</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">desc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InMemoryTableDescriptor</span><span class="o">(</span>
- <span class="mi">5</span>          <span class="s">&quot;t1&quot;</span><span class="o">,</span> <span class="n">KVSerde</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">IntegerSerde</span><span class="o">(),</span> <span class="k">new</span> <span class="n">ProfileJsonSerde</span><span class="o">()))</span>
- <span class="mi">6</span>          <span class="o">.</span><span class="na">withSideInputs</span><span class="o">(</span><span class="n">ImmutableList</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">PROFILE_STREAM</span><span class="o">))</span>
+ <span class="mi">3</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">describe</span><span class="o">(</span><span class="nc">StreamApplicationDescriptor</span> <span class="n">appDesc</span><span class="o">)</span> <span class="o">{</span>
+ <span class="mi">4</span>      <span class="nc">TableDescriptor</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">desc</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InMemoryTableDescriptor</span><span class="o">(</span>
+ <span class="mi">5</span>          <span class="s">"t1"</span><span class="o">,</span> <span class="nc">KVSerde</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">IntegerSerde</span><span class="o">(),</span> <span class="k">new</span> <span class="nc">ProfileJsonSerde</span><span class="o">()))</span>
+ <span class="mi">6</span>          <span class="o">.</span><span class="na">withSideInputs</span><span class="o">(</span><span class="nc">ImmutableList</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="no">PROFILE_STREAM</span><span class="o">))</span>
  <span class="mi">7</span>          <span class="o">.</span><span class="na">withSideInputsProcessor</span><span class="o">((</span><span class="n">msg</span><span class="o">,</span> <span class="n">store</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="o">{</span>
- <span class="mi">8</span>              <span class="n">Profile</span> <span class="n">profile</span> <span class="o">=</span> <span class="o">(</span><span class="n">Profile</span><span class="o">)</span> <span class="n">msg</span><span class="o">.</span><span class="na">getMessage</span><span class="o">();</span>
+ <span class="mi">8</span>              <span class="nc">Profile</span> <span class="n">profile</span> <span class="o">=</span> <span class="o">(</span><span class="nc">Profile</span><span class="o">)</span> <span class="n">msg</span><span class="o">.</span><span class="na">getMessage</span><span class="o">();</span>
  <span class="mi">9</span>              <span class="kt">int</span> <span class="n">key</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="na">getMemberId</span><span class="o">();</span>
-<span class="mi">10</span>              <span class="k">return</span> <span class="n">ImmutableList</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">Entry</span><span class="o">&lt;&gt;(</span><span class="n">key</span><span class="o">,</span> <span class="n">profile</span><span class="o">));</span>
+<span class="mi">10</span>              <span class="k">return</span> <span class="nc">ImmutableList</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">Entry</span><span class="o">&lt;&gt;(</span><span class="n">key</span><span class="o">,</span> <span class="n">profile</span><span class="o">));</span>
 <span class="mi">11</span>            <span class="o">});</span>
 <span class="mi">12</span> 
-<span class="mi">13</span>      <span class="n">Table</span><span class="o">&lt;</span><span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;&gt;</span> <span class="n">table</span> <span class="o">=</span> <span class="n">appDesc</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="n">desc</span><span class="o">);</span>
+<span class="mi">13</span>      <span class="nc">Table</span><span class="o">&lt;</span><span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;&gt;</span> <span class="n">table</span> <span class="o">=</span> <span class="n">appDesc</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="n">desc</span><span class="o">);</span>
 <span class="mi">14</span> 
-<span class="mi">15</span>      <span class="n">appDesc</span><span class="o">.</span><span class="na">getInputStream</span><span class="o">(</span><span class="s">&quot;PageView&quot;</span><span class="o">,</span> <span class="k">new</span> <span class="n">NoOpSerde</span><span class="o">&lt;</span><span class="n">PageView</span><span class="o">&gt;())</span>
-<span class="mi">16</span>          <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="k">new</span> <span class="n">MyMapFunc</span><span class="o">())</span>
-<span class="mi">17</span>          <span class="o">.</span><span class="na">join</span><span class="o">(</span><span class="n">table</span><span class="o">,</span> <span class="k">new</span> <span class="n">MyJoinFunc</span><span class="o">())</span>
+<span class="mi">15</span>      <span class="n">appDesc</span><span class="o">.</span><span class="na">getInputStream</span><span class="o">(</span><span class="s">"PageView"</span><span class="o">,</span> <span class="k">new</span> <span class="nc">NoOpSerde</span><span class="o">&lt;</span><span class="nc">PageView</span><span class="o">&gt;())</span>
+<span class="mi">16</span>          <span class="o">.</span><span class="na">map</span><span class="o">(</span><span class="k">new</span> <span class="nc">MyMapFunc</span><span class="o">())</span>
+<span class="mi">17</span>          <span class="o">.</span><span class="na">join</span><span class="o">(</span><span class="n">table</span><span class="o">,</span> <span class="k">new</span> <span class="nc">MyJoinFunc</span><span class="o">())</span>
 <span class="mi">18</span>          <span class="o">.</span><span class="na">sendTo</span><span class="o">(</span><span class="n">anotherTable</span><span class="o">);</span>
 <span class="mi">19</span>    <span class="o">}</span>
 <span class="mi">21</span>  <span class="o">}</span>
 <span class="mi">22</span>
-<span class="mi">23</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyMapFunc</span> <span class="kd">implements</span> <span class="n">MapFunction</span><span class="o">&lt;</span><span class="n">PageView</span><span class="o">,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;&gt;</span> <span class="o">{</span>
-<span class="mi">24</span>    <span class="kd">private</span> <span class="n">ReadableTable</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">profileTable</span><span class="o">;</span>
+<span class="mi">23</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyMapFunc</span> <span class="kd">implements</span> <span class="nc">MapFunction</span><span class="o">&lt;</span><span class="nc">PageView</span><span class="o">,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;&gt;</span> <span class="o">{</span>
+<span class="mi">24</span>    <span class="kd">private</span> <span class="nc">ReadWriteUpdateTable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">profileTable</span><span class="o">;</span>
 <span class="mi">25</span>
 <span class="mi">26</span>    <span class="nd">@Override</span>
-<span class="mi">27</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Config</span> <span class="n">config</span><span class="o">,</span> <span class="n">TaskContext</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
-<span class="mi">28</span>      <span class="n">profileTable</span> <span class="o">=</span> <span class="o">(</span><span class="n">ReadableTable</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;)</span> <span class="n">context</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="s">&quot;t1&quot;</span><span class="o">);</span>
+<span class="mi">27</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="nc">Config</span> <span class="n">config</span><span class="o">,</span> <span class="nc">TaskContext</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">28</span>      <span class="n">profileTable</span> <span class="o">=</span> <span class="o">(</span><span class="nc">ReadWriteUpdateTable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;)</span> <span class="n">context</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="s">"t1"</span><span class="o">);</span>
 <span class="mi">29</span>    <span class="o">}</span>
 <span class="mi">30</span> 
 <span class="mi">31</span>    <span class="nd">@Override</span>
-<span class="mi">32</span>    <span class="kd">public</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;</span> <span class="nf">apply</span><span class="o">(</span><span class="n">PageView</span> <span class="n">message</span><span class="o">)</span> <span class="o">{</span>
-<span class="mi">33</span>      <span class="k">return</span> <span class="k">new</span> <span class="n">KV</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">message</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">message</span><span class="o">);</span>
+<span class="mi">32</span>    <span class="kd">public</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;</span> <span class="nf">apply</span><span class="o">(</span><span class="nc">PageView</span> <span class="n">message</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">33</span>      <span class="k">return</span> <span class="k">new</span> <span class="no">KV</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">message</span><span class="o">.</span><span class="na">getId</span><span class="o">(),</span> <span class="n">message</span><span class="o">);</span>
 <span class="mi">34</span>    <span class="o">}</span>
 <span class="mi">35</span>  <span class="o">}</span>
 <span class="mi">36</span>
-<span class="mi">37</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyJoinFunc</span> <span class="kd">implements</span> <span class="n">StreamTableJoinFunction</span>
-<span class="mi">38</span>      <span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;,</span> <span class="n">EnrichedPageView</span><span class="o">&gt;</span> <span class="o">{</span>
+<span class="mi">37</span>  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyJoinFunc</span> <span class="kd">implements</span> <span class="nc">StreamTableJoinFunction</span>
+<span class="mi">38</span>      <span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;,</span> <span class="nc">EnrichedPageView</span><span class="o">&gt;</span> <span class="o">{</span>
 <span class="mi">39</span>
 <span class="mi">40</span>    <span class="nd">@Override</span>
-<span class="mi">41</span>    <span class="kd">public</span> <span class="n">EnrichedPageView</span> <span class="nf">apply</span><span class="o">(</span><span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">PageView</span><span class="o">&gt;</span> <span class="n">m</span><span class="o">,</span> <span class="n">KV</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">41</span>    <span class="kd">public</span> <span class="nc">EnrichedPageView</span> <span class="nf">apply</span><span class="o">(</span><span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">PageView</span><span class="o">&gt;</span> <span class="n">m</span><span class="o">,</span> <span class="no">KV</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">r</span><span class="o">)</span> <span class="o">{</span>
 <span class="mi">42</span>      <span class="n">counterPerJoinFn</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">currentSeqNo</span><span class="o">).</span><span class="na">incrementAndGet</span><span class="o">();</span>
-<span class="mi">43</span>        <span class="k">return</span> <span class="n">r</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kc">null</span> <span class="o">:</span> <span class="k">new</span> <span class="n">EnrichedPageView</span><span class="o">(</span>
+<span class="mi">43</span>        <span class="k">return</span> <span class="n">r</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kc">null</span> <span class="o">:</span> <span class="k">new</span> <span class="nc">EnrichedPageView</span><span class="o">(</span>
 <span class="mi">44</span>            <span class="n">m</span><span class="o">.</span><span class="na">getValue</span><span class="o">().</span><span class="na">getPageKey</span><span class="o">(),</span> <span class="n">m</span><span class="o">.</span><span class="na">getKey</span><span class="o">(),</span> <span class="n">r</span><span class="o">.</span><span class="na">getValue</span><span class="o">().</span><span class="na">getCompany</span><span class="o">());</span>
 <span class="mi">45</span>    <span class="o">}</span>
 <span class="mi">46</span>  <span class="o">}</span></code></pre></figure>
 
-<p>The code above uses side inputs to populate the profile table. 
-1. Line 6: Denotes the source stream for the profile table
-2. Line 7-11: Provides an implementation of <code>SideInputsProcessor</code> that reads from profile stream
-     and populates the table.
-3. Line 17: Incoming page views are joined against the profile table.</p>
+<p>The code above uses side inputs to populate the profile table.</p>
+<ol>
+  <li>Line 6: Denotes the source stream for the profile table</li>
+  <li>Line 7-11: Provides an implementation of <code class="language-plaintext highlighter-rouge">SideInputsProcessor</code> that reads from profile stream
+  and populates the table.</li>
+  <li>Line 17: Incoming page views are joined against the profile table.</li>
+</ol>
 
 <h1 id="using-table-with-samza-low-level-api">Using Table with Samza Low Level API</h1>
 
 <p>The code snippet below illustrates the usage of table in Samza Low Level Task API.</p>
 
-<figure class="highlight"><pre><code class="language-java" data-lang="java"><span></span> <span class="mi">1</span>  <span class="kd">class</span> <span class="nc">SamzaTaskApplication</span> <span class="kd">implements</span> <span class="n">TaskApplication</span> <span class="o">{</span>
+<figure class="highlight"><pre><code class="language-java" data-lang="java"> <span class="mi">1</span>  <span class="kd">class</span> <span class="nc">SamzaTaskApplication</span> <span class="kd">implements</span> <span class="nc">TaskApplication</span> <span class="o">{</span>
  <span class="mi">2</span>  
  <span class="mi">3</span>  <span class="nd">@Override</span>
- <span class="mi">4</span>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">describe</span><span class="o">(</span><span class="n">TaskApplicationDescriptor</span> <span class="n">appDesc</span><span class="o">)</span> <span class="o">{</span>
- <span class="mi">5</span>    <span class="n">DelegatingSystemDescriptor</span> <span class="n">ksd</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DelegatingSystemDescriptor</span><span class="o">(</span><span class="s">&quot;mySystem&quot;</span><span class="o">);</span>
+ <span class="mi">4</span>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">describe</span><span class="o">(</span><span class="nc">TaskApplicationDescriptor</span> <span class="n">appDesc</span><span class="o">)</span> <span class="o">{</span>
+ <span class="mi">5</span>    <span class="nc">DelegatingSystemDescriptor</span> <span class="n">ksd</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">DelegatingSystemDescriptor</span><span class="o">(</span><span class="s">"mySystem"</span><span class="o">);</span>
  <span class="mi">6</span> 
- <span class="mi">7</span>    <span class="n">TableDescriptor</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">tableDesc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InMemoryTableDescriptor</span><span class="o">(</span>
- <span class="mi">8</span>        <span class="s">&quot;t1&quot;</span><span class="o">,</span> <span class="n">KVSerde</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">IntegerSerde</span><span class="o">(),</span> <span class="k">new</span> <span class="n">ProfileJsonSerde</span><span class="o">()));</span>
- <span class="mi">9</span>    <span class="n">GenericInputDescriptor</span><span class="o">&lt;</span><span class="n">Profile</span><span class="o">&gt;</span> <span class="n">profileISD</span> <span class="o">=</span> <span class="n">ksd</span><span class="o">.</span><span class="na">getInputDescriptor</span><span class="o">(</span><span class="s">&quot;Profile&quot;</span><span class="o">,</span> <span class="k">new</span> <span class="n">NoOpSerde</span><span class="o">&lt;&gt;());</span>
+ <span class="mi">7</span>    <span class="nc">TableDescriptor</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">tableDesc</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InMemoryTableDescriptor</span><span class="o">(</span>
+ <span class="mi">8</span>        <span class="s">"t1"</span><span class="o">,</span> <span class="nc">KVSerde</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="nc">IntegerSerde</span><span class="o">(),</span> <span class="k">new</span> <span class="nc">ProfileJsonSerde</span><span class="o">()));</span>
+ <span class="mi">9</span>    <span class="nc">GenericInputDescriptor</span><span class="o">&lt;</span><span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">profileISD</span> <span class="o">=</span> <span class="n">ksd</span><span class="o">.</span><span class="na">getInputDescriptor</span><span class="o">(</span><span class="s">"Profile"</span><span class="o">,</span> <span class="k">new</span> <span class="nc">NoOpSerde</span><span class="o">&lt;&gt;());</span>
 <span class="mi">10</span> 
 <span class="mi">11</span>   <span class="n">appDesc</span><span class="o">.</span><span class="na">addTable</span><span class="o">(</span><span class="n">tableDesc</span><span class="o">);</span> 
 <span class="mi">12</span>   <span class="n">appDesc</span><span class="o">.</span><span class="na">addInputStream</span><span class="o">(</span><span class="n">profileISD</span><span class="o">);</span>  
 <span class="mi">13</span> <span class="o">}</span>
 <span class="mi">14</span>
 <span class="mi">15</span>
-<span class="mi">16</span>  <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyStreamTask</span> <span class="kd">implements</span> <span class="n">StreamTask</span><span class="o">,</span> <span class="n">InitableTask</span> <span class="o">{</span>
-<span class="mi">17</span>    <span class="kd">private</span> <span class="n">ReadWriteTable</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;</span> <span class="n">profileTable</span><span class="o">;</span>
+<span class="mi">16</span>  <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyStreamTask</span> <span class="kd">implements</span> <span class="nc">StreamTask</span><span class="o">,</span> <span class="nc">InitableTask</span> <span class="o">{</span>
+<span class="mi">17</span>    <span class="kd">private</span> <span class="nc">ReadWriteUpdateTable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;</span> <span class="n">profileTable</span><span class="o">;</span>
 <span class="mi">18</span> 
 <span class="mi">19</span>    <span class="nd">@Override</span>
-<span class="mi">20</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Config</span> <span class="n">config</span><span class="o">,</span> <span class="n">TaskContext</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
-<span class="mi">21</span>      <span class="n">profileTable</span> <span class="o">=</span> <span class="o">(</span><span class="n">ReadWriteTable</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">,</span> <span class="n">Profile</span><span class="o">&gt;)</span> <span class="n">context</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="s">&quot;t1&quot;</span><span class="o">);</span>
+<span class="mi">20</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="nc">Config</span> <span class="n">config</span><span class="o">,</span> <span class="nc">TaskContext</span> <span class="n">context</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">21</span>      <span class="n">profileTable</span> <span class="o">=</span> <span class="o">(</span><span class="nc">ReadWriteUpdateTable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">Profile</span><span class="o">&gt;)</span> <span class="n">context</span><span class="o">.</span><span class="na">getTable</span><span class="o">(</span><span class="s">"t1"</span><span class="o">);</span>
 <span class="mi">22</span>    <span class="o">}</span>
 <span class="mi">23</span> 
 <span class="mi">24</span>    <span class="nd">@Override</span>
-<span class="mi">25</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">IncomingMessageEnvelope</span> <span class="n">envelope</span><span class="o">,</span> <span class="n">MessageCollector</span> <span class="n">collector</span><span class="o">,</span> <span class="n">TaskCoordinator</span> <span class="n">coordinator</span><span class="o">)</span> <span class="o">{</span>
-<span class="mi">26</span>      <span class="n">String</span> <span class="n">key</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span><span class="n">message</span><span class="o">.</span><span class="na">getKey</span><span class="o">();</span>
-<span class="mi">27</span>      <span class="n">Profile</span> <span class="n">profile</span> <span class="o">=</span> <span class="o">(</span><span class="n">Profile</span><span class="o">)</span><span class="n">message</span><span class="o">.</span><span class="na">getMessage</span><span class="o">();</span>
+<span class="mi">25</span>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="nc">IncomingMessageEnvelope</span> <span class="n">envelope</span><span class="o">,</span> <span class="nc">MessageCollector</span> <span class="n">collector</span><span class="o">,</span> <span class="nc">TaskCoordinator</span> <span class="n">coordinator</span><span class="o">)</span> <span class="o">{</span>
+<span class="mi">26</span>      <span class="nc">String</span> <span class="n">key</span> <span class="o">=</span> <span class="o">(</span><span class="nc">String</span><span class="o">)</span><span class="n">message</span><span class="o">.</span><span class="na">getKey</span><span class="o">();</span>
+<span class="mi">27</span>      <span class="nc">Profile</span> <span class="n">profile</span> <span class="o">=</span> <span class="o">(</span><span class="nc">Profile</span><span class="o">)</span><span class="n">message</span><span class="o">.</span><span class="na">getMessage</span><span class="o">();</span>
 <span class="mi">28</span>      <span class="n">profileTable</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="n">profile</span><span class="o">);</span>
 <span class="mi">29</span>    <span class="o">}</span>
 <span class="mi">30</span>  <span class="o">}</span></code></pre></figure>
@@ -893,247 +909,272 @@ function defined in lines 30-39.</li>
 join with a table and finally write the output to another table.</p>
 
 <ol>
-<li>Line 7-8: A <code>TableDescriptor</code> for an in-memory table is created with tableId “t1”, 
- and then the serde is set. </li>
-<li>Line 9: creates an <code>InputStreamDescriptor</code>.</li>
-<li>Line 11-12: adds <code>TableDescriptor</code> and <code>InputStreamDescriptor</code> to the <code>TaskApplicationDescriptor</code>.</li>
-<li>Line 16: <code>InitiableStreamTask</code> is implemented.</li>
-<li>Line 21: A reference to table “t1” is obtained in the <code>Task.init()</code> method.</li>
-<li>Line 26-28: gets the profile key and record from the incoming stream and writes to the table. </li>
+  <li>Line 7-8: A <code class="language-plaintext highlighter-rouge">TableDescriptor</code> for an in-memory table is created with tableId “t1”, 
+  and then the serde is set.</li>
+  <li>Line 9: creates an <code class="language-plaintext highlighter-rouge">InputStreamDescriptor</code>.</li>
+  <li>Line 11-12: adds <code class="language-plaintext highlighter-rouge">TableDescriptor</code> and <code class="language-plaintext highlighter-rouge">InputStreamDescriptor</code> to the <code class="language-plaintext highlighter-rouge">TaskApplicationDescriptor</code>.</li>
+  <li>Line 16: <code class="language-plaintext highlighter-rouge">InitiableStreamTask</code> is implemented.</li>
+  <li>Line 21: A reference to table “t1” is obtained in the <code class="language-plaintext highlighter-rouge">Task.init()</code> method.</li>
+  <li>Line 26-28: gets the profile key and record from the incoming stream and writes to the table.</li>
 </ol>
 
-<p><a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/ReadableTable.java"><code>ReadableTable</code></a> 
-or <a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/ReadWriteTable.java"><code>ReadWriteTable</code></a> 
+<p>[<code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/ReadWriteUpdateTable.java) 
+or [<code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/table/ReadWriteUpdateTable.java) 
 can be used in the 
-<a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/task/StreamTask.java#L49"><code>StreamTask.process()</code></a> 
+[<code class="language-plaintext highlighter-rouge">StreamTask.process()</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/task/StreamTask.java#L49) 
 method on the table reference obtained 
 in the 
-<a href="https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/task/InitableTask.java#L35"><code>InitableTask.init()</code></a> 
+[<code class="language-plaintext highlighter-rouge">InitableTask.init()</code>] (https://github.com/apache/samza/blob/master/samza-api/src/main/java/org/apache/samza/task/InitableTask.java#L35) 
 method.</p>
 
 <h1 id="table-metrics">Table Metrics</h1>
 
 <p>The table below summarizes table metrics:</p>
 
-<table><thead>
-<tr>
-<th>Metrics</th>
-<th>Class</th>
-<th>Description</th>
-</tr>
-</thead><tbody>
-<tr>
-<td><code>num-batches</code></td>
-<td><code>AsyncBatchingTable</code></td>
-<td>Number of batch operations</td>
-</tr>
-<tr>
-<td><code>batch-ns</code></td>
-<td><code>AsyncBatchingTable</code></td>
-<td>Time interval between opening and closing a batch</td>
-</tr>
-<tr>
-<td><code>get-ns</code></td>
-<td><code>ReadableTable</code></td>
-<td>Average latency of <code>get/getAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>getAll-ns</code></td>
-<td><code>ReadableTable</code></td>
-<td>Average latency of <code>getAll/getAllAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>num-gets</code></td>
-<td><code>ReadableTable</code></td>
-<td>Count of <code>get/getAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>num-getAlls</code></td>
-<td><code>ReadableTable</code></td>
-<td>Count of <code>getAll/getAllAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>num-missed-lookups</code></td>
-<td><code>ReadableTable</code></td>
-<td>Count of missed get/getAll() operations</td>
-</tr>
-<tr>
-<td><code>read-ns</code></td>
-<td><code>ReadableTable</code></td>
-<td>Average latency of <code>readAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>num-reads</code></td>
-<td><code>ReadableTable</code></td>
-<td>Count of <code>readAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>put-ns</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Average latency of <code>put/putAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>putAll-ns</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Average latency of <code>putAll/putAllAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>num-puts</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Count of <code>put/putAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>num-putAlls</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Count of <code>putAll/putAllAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>delete-ns</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Average latency of <code>delete/deleteAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>deleteAll-ns</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Average latency of <code>deleteAll/deleteAllAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>delete-num</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Count of <code>delete/deleteAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>deleteAll-num</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Count of <code>deleteAll/deleteAllAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>num-writes</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Count of <code>writeAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>write-ns</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Average latency of <code>writeAsync()</code> operations</td>
-</tr>
-<tr>
-<td><code>flush-ns</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Average latency of flush operations</td>
-</tr>
-<tr>
-<td><code>flush-num</code></td>
-<td><code>ReadWriteTable</code></td>
-<td>Count of flush operations</td>
-</tr>
-<tr>
-<td><code>hit-rate</code></td>
-<td><code>CachingTable</code></td>
-<td>Cache hit rate (%)</td>
-</tr>
-<tr>
-<td><code>miss-rate</code></td>
-<td><code>CachingTable</code></td>
-<td>Cache miss rate (%)</td>
-</tr>
-<tr>
-<td><code>req-count</code></td>
-<td><code>CachingTable</code></td>
-<td>Count of requests</td>
-</tr>
-<tr>
-<td><code>retry-count</code></td>
-<td><code>TableRetryPolicy</code></td>
-<td>Count of retries executed (excluding the first attempt)</td>
-</tr>
-<tr>
-<td><code>success-count</code></td>
-<td><code>TableRetryPolicy</code></td>
-<td>Count of successes at first attempt</td>
-</tr>
-<tr>
-<td><code>perm-failure-count</code></td>
-<td><code>TableRetryPolicy</code></td>
-<td>Count of operations that failed permanently and exhausted all retries</td>
-</tr>
-<tr>
-<td><code>retry-timer</code></td>
-<td><code>TableRetryPolicy</code></td>
-<td>Total time spent in each IO; this is updated only when at least one retry has been attempted.</td>
-</tr>
-</tbody></table>
+<table>
+  <thead>
+    <tr>
+      <th>Metrics</th>
+      <th>Class</th>
+      <th>Description</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-batches</code></td>
+      <td><code class="language-plaintext highlighter-rouge">AsyncBatchingTable</code></td>
+      <td>Number of batch operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">batch-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">AsyncBatchingTable</code></td>
+      <td>Time interval between opening and closing a batch</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">get-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">get/getAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">getAll-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">getAll/getAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-gets</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">get/getAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-getAlls</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">getAll/getAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-missed-lookups</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of missed get/getAll() operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">read-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">readAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-reads</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">readAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">put-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">put/putAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">putAll-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">putAll/putAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-puts</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">put/putAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-putAlls</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">putAll/putAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">update-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">update/updateAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">updateAll-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">updateAll/updateAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-updates</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">update/updateAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-updateAlls</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">updatesAll/updateAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">delete-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">delete/deleteAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">deleteAll-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">deleteAll/deleteAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">delete-num</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">delete/deleteAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">deleteAll-num</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">deleteAll/deleteAllAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">num-writes</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of <code class="language-plaintext highlighter-rouge">writeAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">write-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of <code class="language-plaintext highlighter-rouge">writeAsync()</code> operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">flush-ns</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Average latency of flush operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">flush-num</code></td>
+      <td><code class="language-plaintext highlighter-rouge">ReadWriteUpdateTable</code></td>
+      <td>Count of flush operations</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">hit-rate</code></td>
+      <td><code class="language-plaintext highlighter-rouge">CachingTable</code></td>
+      <td>Cache hit rate (%)</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">miss-rate</code></td>
+      <td><code class="language-plaintext highlighter-rouge">CachingTable</code></td>
+      <td>Cache miss rate (%)</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">req-count</code></td>
+      <td><code class="language-plaintext highlighter-rouge">CachingTable</code></td>
+      <td>Count of requests</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">retry-count</code></td>
+      <td><code class="language-plaintext highlighter-rouge">TableRetryPolicy</code></td>
+      <td>Count of retries executed (excluding the first attempt)</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">success-count</code></td>
+      <td><code class="language-plaintext highlighter-rouge">TableRetryPolicy</code></td>
+      <td>Count of successes at first attempt</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">perm-failure-count</code></td>
+      <td><code class="language-plaintext highlighter-rouge">TableRetryPolicy</code></td>
+      <td>Count of operations that failed permanently and exhausted all retries</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">retry-timer</code></td>
+      <td><code class="language-plaintext highlighter-rouge">TableRetryPolicy</code></td>
+      <td>Total time spent in each IO; this is updated only when at least one retry has been attempted.</td>
+    </tr>
+  </tbody>
+</table>
 
 <h1 id="table-types">Table Types</h1>
 
 <h2 id="remote-table">Remote Table</h2>
 
-<p><a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code>RemoteTable</code></a> 
+<p><a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code class="language-plaintext highlighter-rouge">RemoteTable</code></a> 
 provides a unified abstraction for Samza applications to access any remote data 
 store through stream-table join in High Level Streams API or direct access in Low Level Task API. Remote Table is a store-agnostic abstraction that can be customized to 
-access new types of stores by writing pluggable I/O &ldquo;Read/Write&rdquo; functions, 
+access new types of stores by writing pluggable I/O “Read/Write” functions, 
 implementations of 
-<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/TableReadFunction.java"><code>TableReadFunction</code></a> and 
-<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/TableWriteFunction.java"><code>TableWriteFunction</code></a> 
+<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/TableReadFunction.java"><code class="language-plaintext highlighter-rouge">TableReadFunction</code></a> and 
+<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/TableWriteFunction.java"><code class="language-plaintext highlighter-rouge">TableWriteFunction</code></a> 
 interfaces. Remote Table also provides common functionality, eg. rate limiting 
 (built-in) and caching (hybrid).</p>
 
 <p>The async APIs in Remote Table are recommended over the sync versions for higher 
 throughput. They can be used with Samza with Low Level Task API to achieve the maximum 
-throughput. </p>
+throughput.</p>
 
 <p>Remote Tables are represented by class 
-<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteReadableTable.java"><code>RemoteReadableTable</code></a> and 
-<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteReadWriteTable.java"><code>RemoteReadWriteTable</code></a>. 
+<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteReadWriteUpdateTable.java"><code class="language-plaintext highlighter-rouge">RemoteReadWriteUpdateTable</code></a> and 
+<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteReadWriteUpdateTable.java"><code class="language-plaintext highlighter-rouge">RemoteReadWriteUpdateTable</code></a>. 
 All configuration options of a Remote Table can be found in the 
-<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code>RemoteTableDescriptor</code></a> class. </p>
+<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code class="language-plaintext highlighter-rouge">RemoteTableDescriptor</code></a> class.</p>
 
 <p>Couchbase is supported as remote table. See
-<a href="https://github.com/apache/samza/blob/master/samza-kv-couchbase/src/main/java/org/apache/samza/table/remote/couchbase/CouchbaseTableReadFunction.java"><code>CouchbaseTableReadFunction</code></a> and 
-<a href="https://github.com/apache/samza/blob/master/samza-kv-couchbase/src/main/java/org/apache/samza/table/remote/couchbase/CouchbaseTableWriteFunction.java"><code>CouchbaseTableWriteFunction</code></a>.</p>
+<a href="https://github.com/apache/samza/blob/master/samza-kv-couchbase/src/main/java/org/apache/samza/table/remote/couchbase/CouchbaseTableReadFunction.java"><code class="language-plaintext highlighter-rouge">CouchbaseTableReadFunction</code></a> and 
+<a href="https://github.com/apache/samza/blob/master/samza-kv-couchbase/src/main/java/org/apache/samza/table/remote/couchbase/CouchbaseTableWriteFunction.java"><code class="language-plaintext highlighter-rouge">CouchbaseTableWriteFunction</code></a>.</p>
 
 <h3 id="batching">Batching</h3>
 
 <p>Remote Table has built-in client-side batching support for its async executions.
 This is useful when a remote data store supports batch processing and is not sophisticated enough
-to handle heavy inbound requests. </p>
+to handle heavy inbound requests.</p>
 
 <h4 id="configuration">Configuration</h4>
 
-<p>Batching can be enabled with <a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code>RemoteTableDescriptor</code></a>
-by providing a <a href="https://github.com/apache/samza/samza-api/src/main/java/org/apache/samza/table/batching/BatchProvider.java"><code>BatchProvider</code></a>
+<p>Batching can be enabled with <a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code class="language-plaintext highlighter-rouge">RemoteTableDescriptor</code></a>
+by providing a <a href="https://github.com/apache/samza/samza-api/src/main/java/org/apache/samza/table/batching/BatchProvider.java"><code class="language-plaintext highlighter-rouge">BatchProvider</code></a>
 The user can choose:</p>
 
 <ol>
-<li>A <a href="https://github.com/apache/samza/samza-core/src/main/java/org/apache/samza/table/batching/CompactBatchProvider.java"><code>CompactBatchProvider</code></a> which provides a batch such that
+  <li>A <a href="https://github.com/apache/samza/samza-core/src/main/java/org/apache/samza/table/batching/CompactBatchProvider.java"><code class="language-plaintext highlighter-rouge">CompactBatchProvider</code></a> which provides a batch such that
 the operations are compacted by the key. For update operations, the latter update will override the value of the previous one when they have the same key. For query operations,
-the operations will be combined as a single operation when they have the same key. </li>
-<li>A <a href="https://github.com/apache/samza/samza-core/src/main/java/org/apache/samza/table/batching/CompleteBatchProvider.java"><code>CompleteBatchProvider</code></a> which provides a batch such that
+the operations will be combined as a single operation when they have the same key.</li>
+  <li>A <a href="https://github.com/apache/samza/samza-core/src/main/java/org/apache/samza/table/batching/CompleteBatchProvider.java"><code class="language-plaintext highlighter-rouge">CompleteBatchProvider</code></a> which provides a batch such that
 all the operations will be visible to the remote store regardless of the keys.</li>
-<li>A user-defined instance of [<code>BatchProvider</code>].</li>
+  <li>A user-defined instance of [<code class="language-plaintext highlighter-rouge">BatchProvider</code>].</li>
 </ol>
 
-<p>For each [<code>BatchProvider</code>], the user can config the following:
-1. Specify the max size the batch can grow before being closed by <code>withmaxBatchSize(int)</code>
-2. Specify the max time the batch can last before being closed by <code>withmaxBatchDelay(Duration)</code></p>
+<p>For each [<code class="language-plaintext highlighter-rouge">BatchProvider</code>], the user can config the following:</p>
+<ol>
+  <li>Specify the max size the batch can grow before being closed by <code class="language-plaintext highlighter-rouge">withmaxBatchSize(int)</code></li>
+  <li>Specify the max time the batch can last before being closed by <code class="language-plaintext highlighter-rouge">withmaxBatchDelay(Duration)</code></li>
+</ol>
 
 <h3 id="rate-limiting">Rate Limiting</h3>
 
 <p>Remote Table has built-in client-side rate limiting support in both of its sync 
 and async executions. This is useful when a remote data store does not have 
 server-side rate limiting or is not sophisticated enough to handle heavy 
-inbound requests. </p>
+inbound requests.</p>
 
-<h4 id="configuration">Configuration</h4>
+<h4 id="configuration-1">Configuration</h4>
 
-<p>Rate limiting can be enabled with <a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code>RemoteTableDescriptor</code></a> in two ways:</p>
+<p>Rate limiting can be enabled with <a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code class="language-plaintext highlighter-rouge">RemoteTableDescriptor</code></a> in two ways:</p>
 
 <ol>
-<li>Default: <code>withReadRateLimit()</code> and <code>withWriteRateLimit()</code>. The 
+  <li>Default: <code class="language-plaintext highlighter-rouge">withReadRateLimit()</code> and <code class="language-plaintext highlighter-rouge">withWriteRateLimit()</code>. The 
 <a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/util/EmbeddedTaggedRateLimiter.java">default implementation</a>
 uses <a href="https://google.github.io/guava/releases/snapshot-jre/api/docs/com/google/common/util/concurrent/RateLimiter.html">Guava</a>
 for rate limiting and provides basic throttling on read/write rates.</li>
-<li>User-defined instance: <code>withRateLimiter()</code>. Tailored for more advanced 
+  <li>User-defined instance: <code class="language-plaintext highlighter-rouge">withRateLimiter()</code>. Tailored for more advanced 
 usages, eg. custom policies and/or rate limiter libraries</li>
 </ol>
 
@@ -1150,23 +1191,23 @@ behaviors of distributed data stores. To
 built-in support for retrying failed I/O operations originated from the data store 
 clients.</p>
 
-<p>Retry capability can be added to a <a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code>RemoteTableDescriptor</code></a> by providing a 
-<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/retry/TableRetryPolicy.java"><code>TableRetryPolicy</code></a>,
- which consists of three aspects: </p>
+<p>Retry capability can be added to a <a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/remote/RemoteTableDescriptor.java"><code class="language-plaintext highlighter-rouge">RemoteTableDescriptor</code></a> by providing a 
+[<code class="language-plaintext highlighter-rouge">TableRetryPolicy</code>] (https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/retry/TableRetryPolicy.java),
+ which consists of three aspects:</p>
 
 <ul>
-<li>Backoff/Sleep policy - fixed, random, exponential with jitters</li>
-<li>Termination policy - by total attempts and/or delay</li>
-<li>Retriable exception classification - predicate on <code>Throwable</code></li>
+  <li>Backoff/Sleep policy - fixed, random, exponential with jitters</li>
+  <li>Termination policy - by total attempts and/or delay</li>
+  <li>Retriable exception classification - predicate on <code class="language-plaintext highlighter-rouge">Throwable</code></li>
 </ul>
 
 <p>By default, retry is disabled as such failed I/O operations will propagate up and 
 the caller is expected to handle the exception. When enabled, retry is on a 
-per-request basis such that each individual request is retried independently. </p>
+per-request basis such that each individual request is retried independently.</p>
 
 <p>Lastly, Remote Table retry provides a set of standard metrics for monitoring. 
 They can be found in 
-<a href="https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/retry/RetryMetrics.java"><code>RetryMetrics</code></a>.</p>
+[<code class="language-plaintext highlighter-rouge">RetryMetrics</code>] (https://github.com/apache/samza/blob/master/samza-core/src/main/java/org/apache/samza/table/retry/RetryMetrics.java).</p>
 
 <h3 id="supporting-additional-operations">Supporting Additional Operations</h3>
 
@@ -1174,59 +1215,59 @@ They can be found in
 supported through the Get/Put/Delete methods. Two categories of operations are supported</p>
 
 <ul>
-<li>Get/Put/Delete operations with additional arguments</li>
-<li>Arbitrary operations through readAsync() and writeAsync()<br></li>
+  <li>Get/Put/Delete operations with additional arguments</li>
+  <li>Arbitrary operations through readAsync() and writeAsync()</li>
 </ul>
 
 <p>We only mandate implementers of table functions to provide implementation for Get/Put/Delete 
 without additional arguments. End users can subclass a table function, and invoke operations
 on remote store directly, if they are not supported by a table function.</p>
 
-<figure class="highlight"><pre><code class="language-java" data-lang="java"><span></span> <span class="mi">1</span>  <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyCouchbaseTableWriteFunction</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;</span> <span class="kd">extends</span> <span class="n">CouchbaseTableWriteFunction</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;</span> <span class="o">{</span>
+<figure class="highlight"><pre><code class="language-java" data-lang="java"> <span class="mi">1</span>  <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyCouchbaseTableWriteFunction</span><span class="o">&lt;</span><span class="no">V</span><span class="o">&gt;</span> <span class="kd">extends</span> <span class="nc">CouchbaseTableWriteFunction</span><span class="o">&lt;</span><span class="no">V</span><span class="o">&gt;</span> <span class="o">{</span>
  <span class="mi">2</span>
- <span class="mi">3</span>    <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">OP_COUNTER</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span>
+ <span class="mi">3</span>    <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="no">OP_COUNTER</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span>
  <span class="mi">4</span>
  <span class="mi">5</span>    <span class="nd">@Override</span>
- <span class="mi">6</span>    <span class="kd">public</span> <span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">CompletableFuture</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="nf">writeAsync</span><span class="o">(</span><span class="kt">int</span> <span class="n">opId</span><span class="o">,</span> <span class="n">Object</span><span class="o">...</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
- <span class="mi">7</span>      <span class="k">if</span> <span class="o">(</span><span class="n">OP_COUNTER</span> <span class="o">==</span> <span class="n">opId</span><span class="o">)</span> <span class="o">{</span>

[... 397 lines stripped ...]