You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by al...@apache.org on 2017/05/10 04:25:41 UTC

[1/3] beam-site git commit: Move extension README files to website

Repository: beam-site
Updated Branches:
  refs/heads/asf-site 47ad18557 -> acd643afb


Move extension README files to website


Project: http://git-wip-us.apache.org/repos/asf/beam-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/beam-site/commit/8ed3f247
Tree: http://git-wip-us.apache.org/repos/asf/beam-site/tree/8ed3f247
Diff: http://git-wip-us.apache.org/repos/asf/beam-site/diff/8ed3f247

Branch: refs/heads/asf-site
Commit: 8ed3f247b8600b7651cffff5186ba145473e97ed
Parents: 47ad185
Author: Ahmet Altay <al...@google.com>
Authored: Tue May 9 17:47:01 2017 -0700
Committer: Ahmet Altay <al...@google.com>
Committed: Tue May 9 21:21:25 2017 -0700

----------------------------------------------------------------------
 src/documentation/runners/flink.md        |  2 +-
 src/documentation/sdks/java-extensions.md | 59 ++++++++++++++++++++++++++
 src/documentation/sdks/java.md            |  8 ++++
 3 files changed, 68 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/beam-site/blob/8ed3f247/src/documentation/runners/flink.md
----------------------------------------------------------------------
diff --git a/src/documentation/runners/flink.md b/src/documentation/runners/flink.md
index f844c6b..685917e 100644
--- a/src/documentation/runners/flink.md
+++ b/src/documentation/runners/flink.md
@@ -138,7 +138,7 @@ When executing your pipeline with the Flink Runner, you can set these pipeline o
 </tr>
 </table>
 
-See the reference documentation for the  <span class="language-java">[FlinkPipelineOptions]({{ site.baseurl }}/documentation/sdks/javadoc/{{ site.release_latest }}/index.html?org/apache/beam/runners/flink/FlinkPipelineOptions.html)</span><span class="language-py">[PipelineOptions](https://github.com/apache/beam/blob/master/sdks/python/apache_beam/utils/pipeline_options.py)</span> interface (and its subinterfaces) for the complete list of pipeline configuration options.
+See the reference documentation for the  <span class="language-java">[FlinkPipelineOptions]({{ site.baseurl }}/documentation/sdks/javadoc/{{ site.release_latest }}/index.html?org/apache/beam/runners/flink/FlinkPipelineOptions.html)</span><span class="language-py">[PipelineOptions](https://github.com/apache/beam/blob/master/sdks/python/apache_beam/options/pipeline_options.py)</span> interface (and its subinterfaces) for the complete list of pipeline configuration options.
 
 ## Additional information and caveats
 

http://git-wip-us.apache.org/repos/asf/beam-site/blob/8ed3f247/src/documentation/sdks/java-extensions.md
----------------------------------------------------------------------
diff --git a/src/documentation/sdks/java-extensions.md b/src/documentation/sdks/java-extensions.md
new file mode 100644
index 0000000..a4694af
--- /dev/null
+++ b/src/documentation/sdks/java-extensions.md
@@ -0,0 +1,59 @@
+---
+layout: default
+title: "Beam Java SDK Extensions"
+permalink: /documentation/sdks/java-extensions/
+---
+# Apache Beam Java SDK Extensions
+
+## <a name="join-library"></a>Join-library
+
+Join-library provides inner join, outer left join, and outer right join functions. The aim
+is to simplify the most common cases of join to a simple function call.
+
+The functions are generic and support joins of any Beam-supported types.
+Input to the join functions are `PCollections` of `Key` / `Value`s. Both
+the left and right `PCollection`s need the same type for the key. All the join
+functions return a `Key` / `Value` where `Key` is the join key and value is
+a `Key` / `Value` where the key is the left value and right is the value.
+
+For outer joins, the user must provide a value that represents `null` because `null`
+cannot be serialized.
+
+Example usage:
+
+```
+PCollection<KV<String, String>> leftPcollection = ...
+PCollection<KV<String, Long>> rightPcollection = ...
+
+PCollection<KV<String, KV<String, Long>>> joinedPcollection =
+  Join.innerJoin(leftPcollection, rightPcollection);
+```
+
+
+## <a name="sorter"></a>Sorter
+
+This module provides the `SortValues` transform, which takes a `PCollection<KV<K, Iterable<KV<K2, V>>>>` and produces a `PCollection<KV<K, Iterable<KV<K2, V>>>>` where, for each primary key `K` the paired `Iterable<KV<K2, V>>` has been sorted by the byte encoding of secondary key (`K2`). It is an efficient and scalable sorter for iterables, even if they are large (do not fit in memory).
+
+### Caveats
+
+- This transform performs value-only sorting; the iterable accompanying each key is sorted, but *there is no relationship between different keys*, as Beam does not support any defined relationship between different elements in a `PCollection`.
+* Each `Iterable<KV<K2, V>>` is sorted on a single worker using local memory and disk. This means that `SortValues` may be a performance and/or scalability bottleneck when used in different pipelines. For example, users are discouraged from using `SortValues` on a `PCollection` of a single element to globally sort a large `PCollection`. A (rough) estimate of the number of bytes of disk space utilized if sorting spills to disk is `numRecords * (numSecondaryKeyBytesPerRecord + numValueBytesPerRecord + 16) * 3`.
+
+### Options
+
+* The user can customize the temporary location used if sorting requires spilling to disk and the maximum amount of memory to use by creating a custom instance of `BufferedExternalSorter.Options` to pass into `SortValues.create`.
+
+### Example usage of `SortValues`
+
+```
+PCollection<KV<String, KV<String, Integer>>> input = ...
+
+// Group by primary key, bringing <SecondaryKey, Value> pairs for the same key together.
+PCollection<KV<String, Iterable<KV<String, Integer>>>> grouped =
+    input.apply(GroupByKey.<String, KV<String, Integer>>create());
+
+// For every primary key, sort the iterable of <SecondaryKey, Value> pairs by secondary key.
+PCollection<KV<String, Iterable<KV<String, Integer>>>> groupedAndSorted =
+    grouped.apply(
+        SortValues.<String, String, Integer>create(new BufferedExternalSorter.Options()));
+```

http://git-wip-us.apache.org/repos/asf/beam-site/blob/8ed3f247/src/documentation/sdks/java.md
----------------------------------------------------------------------
diff --git a/src/documentation/sdks/java.md b/src/documentation/sdks/java.md
index 3275914..7cfe96f 100644
--- a/src/documentation/sdks/java.md
+++ b/src/documentation/sdks/java.md
@@ -23,3 +23,11 @@ The Java SDK supports all features currently supported by the Beam model.
 
 ## Pipeline I/O
 See the [Beam-provided I/O Transforms]({{site.baseurl }}/documentation/io/built-in/) page for a list of the currently available I/O transforms.
+
+
+## Extensions
+
+The Java SDK has the following extensions:
+
+- [join-library]({{site.baseurl}}/documentation/sdks/java-extensions/#join-library) provides inner join, outer left join, and outer right join functions.
+- [sorter]({{site.baseurl}}/documentation/sdks/java-extensions/#sorter) is an efficient and scalable sorter for large iterables.


[3/3] beam-site git commit: This closes #237

Posted by al...@apache.org.
This closes #237


Project: http://git-wip-us.apache.org/repos/asf/beam-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/beam-site/commit/acd643af
Tree: http://git-wip-us.apache.org/repos/asf/beam-site/tree/acd643af
Diff: http://git-wip-us.apache.org/repos/asf/beam-site/diff/acd643af

Branch: refs/heads/asf-site
Commit: acd643afbddeae5491d8d3af455249557e32c9c4
Parents: 47ad185 aa01f11
Author: Ahmet Altay <al...@google.com>
Authored: Tue May 9 21:24:35 2017 -0700
Committer: Ahmet Altay <al...@google.com>
Committed: Tue May 9 21:24:35 2017 -0700

----------------------------------------------------------------------
 content/documentation/runners/flink/index.html  |   2 +-
 .../sdks/java-extensions/index.html             | 237 +++++++++++++++++++
 content/documentation/sdks/java/index.html      |   9 +
 src/documentation/runners/flink.md              |   2 +-
 src/documentation/sdks/java-extensions.md       |  59 +++++
 src/documentation/sdks/java.md                  |   8 +
 6 files changed, 315 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[2/3] beam-site git commit: Regenerate website

Posted by al...@apache.org.
Regenerate website


Project: http://git-wip-us.apache.org/repos/asf/beam-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/beam-site/commit/aa01f116
Tree: http://git-wip-us.apache.org/repos/asf/beam-site/tree/aa01f116
Diff: http://git-wip-us.apache.org/repos/asf/beam-site/diff/aa01f116

Branch: refs/heads/asf-site
Commit: aa01f1161bbbfc0060ab76ebad6bfcee7826e963
Parents: 8ed3f24
Author: Ahmet Altay <al...@google.com>
Authored: Tue May 9 21:24:35 2017 -0700
Committer: Ahmet Altay <al...@google.com>
Committed: Tue May 9 21:24:35 2017 -0700

----------------------------------------------------------------------
 content/documentation/runners/flink/index.html  |   2 +-
 .../sdks/java-extensions/index.html             | 237 +++++++++++++++++++
 content/documentation/sdks/java/index.html      |   9 +
 3 files changed, 247 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/beam-site/blob/aa01f116/content/documentation/runners/flink/index.html
----------------------------------------------------------------------
diff --git a/content/documentation/runners/flink/index.html b/content/documentation/runners/flink/index.html
index 64ae583..deb04c8 100644
--- a/content/documentation/runners/flink/index.html
+++ b/content/documentation/runners/flink/index.html
@@ -287,7 +287,7 @@
 </tr>
 </table>
 
-<p>See the reference documentation for the  <span class="language-java"><a href="/documentation/sdks/javadoc/0.6.0/index.html?org/apache/beam/runners/flink/FlinkPipelineOptions.html">FlinkPipelineOptions</a></span><span class="language-py"><a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/utils/pipeline_options.py">PipelineOptions</a></span> interface (and its subinterfaces) for the complete list of pipeline configuration options.</p>
+<p>See the reference documentation for the  <span class="language-java"><a href="/documentation/sdks/javadoc/0.6.0/index.html?org/apache/beam/runners/flink/FlinkPipelineOptions.html">FlinkPipelineOptions</a></span><span class="language-py"><a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/options/pipeline_options.py">PipelineOptions</a></span> interface (and its subinterfaces) for the complete list of pipeline configuration options.</p>
 
 <h2 id="additional-information-and-caveats">Additional information and caveats</h2>
 

http://git-wip-us.apache.org/repos/asf/beam-site/blob/aa01f116/content/documentation/sdks/java-extensions/index.html
----------------------------------------------------------------------
diff --git a/content/documentation/sdks/java-extensions/index.html b/content/documentation/sdks/java-extensions/index.html
new file mode 100644
index 0000000..ee93238
--- /dev/null
+++ b/content/documentation/sdks/java-extensions/index.html
@@ -0,0 +1,237 @@
+<!DOCTYPE html>
+<html lang="en">
+
+  <head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <title>Beam Java SDK Extensions</title>
+  <meta name="description" content="Apache Beam is an open source, unified model and set of language-specific SDKs for defining and executing data processing workflows, and also data ingestion and integration flows, supporting Enterprise Integration Patterns (EIPs) and Domain Specific Languages (DSLs). Dataflow pipelines simplify the mechanics of large-scale batch and streaming data processing and can run on a number of runtimes like Apache Flink, Apache Spark, and Google Cloud Dataflow (a cloud service). Beam also brings DSL in different languages, allowing users to easily implement their data integration processes.
+">
+
+  <link rel="stylesheet" href="/styles/site.css">
+  <link rel="stylesheet" href="/css/theme.css">
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
+  <script src="/js/bootstrap.min.js"></script>
+  <script src="/js/language-switch.js"></script>
+  <link rel="canonical" href="https://beam.apache.org/documentation/sdks/java-extensions/" data-proofer-ignore>
+  <link rel="alternate" type="application/rss+xml" title="Apache Beam" href="https://beam.apache.org/feed.xml">
+  <script>
+    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+    ga('create', 'UA-73650088-1', 'auto');
+    ga('send', 'pageview');
+
+  </script>
+  <link rel="shortcut icon" type="image/x-icon" href="/images/favicon.ico">
+</head>
+
+
+  <body role="document">
+
+    <nav class="navbar navbar-default navbar-fixed-top">
+  <div class="container">
+    <div class="navbar-header">
+      <a href="/" class="navbar-brand" >
+        <img alt="Brand" style="height: 25px" src="/images/beam_logo_navbar.png">
+      </a>
+      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+        <span class="sr-only">Toggle navigation</span>
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+      </button>
+    </div>
+    <div id="navbar" class="navbar-collapse collapse">
+      <ul class="nav navbar-nav">
+        <li class="dropdown">
+		  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Get Started <span class="caret"></span></a>
+		  <ul class="dropdown-menu">
+			  <li><a href="/get-started/beam-overview/">Beam Overview</a></li>
+        <li><a href="/get-started/quickstart-java/">Quickstart - Java</a></li>
+        <li><a href="/get-started/quickstart-py/">Quickstart - Python</a></li>
+			  <li role="separator" class="divider"></li>
+			  <li class="dropdown-header">Example Walkthroughs</li>
+			  <li><a href="/get-started/wordcount-example/">WordCount</a></li>
+			  <li><a href="/get-started/mobile-gaming-example/">Mobile Gaming</a></li>
+              <li role="separator" class="divider"></li>
+              <li class="dropdown-header">Resources</li>
+              <li><a href="/get-started/downloads">Downloads</a></li>
+              <li><a href="/get-started/support">Support</a></li>
+		  </ul>
+	    </li>
+        <li class="dropdown">
+		  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Documentation <span class="caret"></span></a>
+		  <ul class="dropdown-menu">
+			  <li><a href="/documentation">Using the Documentation</a></li>
+			  <li role="separator" class="divider"></li>
+			  <li class="dropdown-header">Beam Concepts</li>
+			  <li><a href="/documentation/programming-guide/">Programming Guide</a></li>
+			  <li><a href="/documentation/resources/">Additional Resources</a></li>
+			  <li role="separator" class="divider"></li>
+              <li class="dropdown-header">Pipeline Fundamentals</li>
+              <li><a href="/documentation/pipelines/design-your-pipeline/">Design Your Pipeline</a></li>
+              <li><a href="/documentation/pipelines/create-your-pipeline/">Create Your Pipeline</a></li>
+              <li><a href="/documentation/pipelines/test-your-pipeline/">Test Your Pipeline</a></li>
+              <li><a href="/documentation/io/io-toc/">Pipeline I/O</a></li>
+              <li role="separator" class="divider"></li>
+			  <li class="dropdown-header">SDKs</li>
+			  <li><a href="/documentation/sdks/java/">Java SDK</a></li>
+			  <li><a href="/documentation/sdks/javadoc/0.6.0/" target="_blank">Java SDK API Reference <img src="/images/external-link-icon.png"
+                 width="14" height="14"
+                 alt="External link."></a>
+        </li>
+        <li><a href="/documentation/sdks/python/">Python SDK</a></li>
+        <li><a href="/documentation/sdks/pydoc/0.6.0/" target="_blank">Python SDK API Reference <img src="/images/external-link-icon.png"
+                 width="14" height="14"
+                 alt="External link."></a>
+        </li>
+			  <li role="separator" class="divider"></li>
+			  <li class="dropdown-header">Runners</li>
+			  <li><a href="/documentation/runners/capability-matrix/">Capability Matrix</a></li>
+			  <li><a href="/documentation/runners/direct/">Direct Runner</a></li>
+			  <li><a href="/documentation/runners/apex/">Apache Apex Runner</a></li>
+			  <li><a href="/documentation/runners/flink/">Apache Flink Runner</a></li>
+			  <li><a href="/documentation/runners/spark/">Apache Spark Runner</a></li>
+			  <li><a href="/documentation/runners/dataflow/">Cloud Dataflow Runner</a></li>
+		  </ul>
+	    </li>
+        <li class="dropdown">
+		  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Contribute <span class="caret"></span></a>
+		  <ul class="dropdown-menu">
+			  <li><a href="/contribute">Get Started Contributing</a></li>
+        <li role="separator" class="divider"></li>
+        <li class="dropdown-header">Guides</li>
+			  <li><a href="/contribute/contribution-guide/">Contribution Guide</a></li>
+        <li><a href="/contribute/testing/">Testing Guide</a></li>
+        <li><a href="/contribute/release-guide/">Release Guide</a></li>
+        <li><a href="/contribute/ptransform-style-guide/">PTransform Style Guide</a></li>
+        <li role="separator" class="divider"></li>
+        <li class="dropdown-header">Technical References</li>
+        <li><a href="/contribute/design-principles/">Design Principles</a></li>
+			  <li><a href="/contribute/work-in-progress/">Ongoing Projects</a></li>
+        <li><a href="/contribute/source-repository/">Source Repository</a></li>
+        <li role="separator" class="divider"></li>
+			  <li class="dropdown-header">Promotion</li>
+        <li><a href="/contribute/presentation-materials/">Presentation Materials</a></li>
+        <li><a href="/contribute/logos/">Logos and Design</a></li>
+        <li role="separator" class="divider"></li>
+        <li><a href="/contribute/maturity-model/">Maturity Model</a></li>
+        <li><a href="/contribute/team/">Team</a></li>
+		  </ul>
+	    </li>
+
+        <li><a href="/blog">Blog</a></li>
+      </ul>
+      <ul class="nav navbar-nav navbar-right">
+        <li class="dropdown">
+          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><img src="https://www.apache.org/foundation/press/kit/feather_small.png" alt="Apache Logo" style="height:24px;">Apache Software Foundation<span class="caret"></span></a>
+          <ul class="dropdown-menu dropdown-menu-right">
+            <li><a href="http://www.apache.org/">ASF Homepage</a></li>
+            <li><a href="http://www.apache.org/licenses/">License</a></li>
+            <li><a href="http://www.apache.org/security/">Security</a></li>
+            <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+            <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
+            <li><a href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a></li>
+          </ul>
+        </li>
+      </ul>
+    </div><!--/.nav-collapse -->
+  </div>
+</nav>
+
+
+<link rel="stylesheet" href="">
+
+
+    <div class="container" role="main">
+
+      <div class="row">
+        <h1 id="apache-beam-java-sdk-extensions">Apache Beam Java SDK Extensions</h1>
+
+<h2 id="a-namejoin-libraryajoin-library"><a name="join-library"></a>Join-library</h2>
+
+<p>Join-library provides inner join, outer left join, and outer right join functions. The aim
+is to simplify the most common cases of join to a simple function call.</p>
+
+<p>The functions are generic and support joins of any Beam-supported types.
+Input to the join functions are <code class="highlighter-rouge">PCollections</code> of <code class="highlighter-rouge">Key</code> / <code class="highlighter-rouge">Value</code>s. Both
+the left and right <code class="highlighter-rouge">PCollection</code>s need the same type for the key. All the join
+functions return a <code class="highlighter-rouge">Key</code> / <code class="highlighter-rouge">Value</code> where <code class="highlighter-rouge">Key</code> is the join key and value is
+a <code class="highlighter-rouge">Key</code> / <code class="highlighter-rouge">Value</code> where the key is the left value and right is the value.</p>
+
+<p>For outer joins, the user must provide a value that represents <code class="highlighter-rouge">null</code> because <code class="highlighter-rouge">null</code>
+cannot be serialized.</p>
+
+<p>Example usage:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>PCollection&lt;KV&lt;String, String&gt;&gt; leftPcollection = ...
+PCollection&lt;KV&lt;String, Long&gt;&gt; rightPcollection = ...
+
+PCollection&lt;KV&lt;String, KV&lt;String, Long&gt;&gt;&gt; joinedPcollection =
+  Join.innerJoin(leftPcollection, rightPcollection);
+</code></pre>
+</div>
+
+<h2 id="a-namesorterasorter"><a name="sorter"></a>Sorter</h2>
+
+<p>This module provides the <code class="highlighter-rouge">SortValues</code> transform, which takes a <code class="highlighter-rouge">PCollection&lt;KV&lt;K, Iterable&lt;KV&lt;K2, V&gt;&gt;&gt;&gt;</code> and produces a <code class="highlighter-rouge">PCollection&lt;KV&lt;K, Iterable&lt;KV&lt;K2, V&gt;&gt;&gt;&gt;</code> where, for each primary key <code class="highlighter-rouge">K</code> the paired <code class="highlighter-rouge">Iterable&lt;KV&lt;K2, V&gt;&gt;</code> has been sorted by the byte encoding of secondary key (<code class="highlighter-rouge">K2</code>). It is an efficient and scalable sorter for iterables, even if they are large (do not fit in memory).</p>
+
+<h3 id="caveats">Caveats</h3>
+
+<ul>
+  <li>This transform performs value-only sorting; the iterable accompanying each key is sorted, but <em>there is no relationship between different keys</em>, as Beam does not support any defined relationship between different elements in a <code class="highlighter-rouge">PCollection</code>.</li>
+  <li>Each <code class="highlighter-rouge">Iterable&lt;KV&lt;K2, V&gt;&gt;</code> is sorted on a single worker using local memory and disk. This means that <code class="highlighter-rouge">SortValues</code> may be a performance and/or scalability bottleneck when used in different pipelines. For example, users are discouraged from using <code class="highlighter-rouge">SortValues</code> on a <code class="highlighter-rouge">PCollection</code> of a single element to globally sort a large <code class="highlighter-rouge">PCollection</code>. A (rough) estimate of the number of bytes of disk space utilized if sorting spills to disk is <code class="highlighter-rouge">numRecords * (numSecondaryKeyBytesPerRecord + numValueBytesPerRecord + 16) * 3</code>.</li>
+</ul>
+
+<h3 id="options">Options</h3>
+
+<ul>
+  <li>The user can customize the temporary location used if sorting requires spilling to disk and the maximum amount of memory to use by creating a custom instance of <code class="highlighter-rouge">BufferedExternalSorter.Options</code> to pass into <code class="highlighter-rouge">SortValues.create</code>.</li>
+</ul>
+
+<h3 id="example-usage-of-sortvalues">Example usage of <code class="highlighter-rouge">SortValues</code></h3>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>PCollection&lt;KV&lt;String, KV&lt;String, Integer&gt;&gt;&gt; input = ...
+
+// Group by primary key, bringing &lt;SecondaryKey, Value&gt; pairs for the same key together.
+PCollection&lt;KV&lt;String, Iterable&lt;KV&lt;String, Integer&gt;&gt;&gt;&gt; grouped =
+    input.apply(GroupByKey.&lt;String, KV&lt;String, Integer&gt;&gt;create());
+
+// For every primary key, sort the iterable of &lt;SecondaryKey, Value&gt; pairs by secondary key.
+PCollection&lt;KV&lt;String, Iterable&lt;KV&lt;String, Integer&gt;&gt;&gt;&gt; groupedAndSorted =
+    grouped.apply(
+        SortValues.&lt;String, String, Integer&gt;create(new BufferedExternalSorter.Options()));
+</code></pre>
+</div>
+
+      </div>
+
+
+    <hr>
+  <div class="row">
+      <div class="col-xs-12">
+          <footer>
+              <p class="text-center">
+                &copy; Copyright
+                <a href="http://www.apache.org">The Apache Software Foundation</a>,
+                2017. All Rights Reserved.
+              </p>
+              <p class="text-center">
+                <a href="/privacy_policy">Privacy Policy</a> |
+                <a href="/feed.xml">RSS Feed</a>
+              </p>
+          </footer>
+      </div>
+  </div>
+  <!-- container div end -->
+</div>
+
+
+  </body>
+
+</html>

http://git-wip-us.apache.org/repos/asf/beam-site/blob/aa01f116/content/documentation/sdks/java/index.html
----------------------------------------------------------------------
diff --git a/content/documentation/sdks/java/index.html b/content/documentation/sdks/java/index.html
index d44c20f..08d5819 100644
--- a/content/documentation/sdks/java/index.html
+++ b/content/documentation/sdks/java/index.html
@@ -168,6 +168,15 @@
 <h2 id="pipeline-io">Pipeline I/O</h2>
 <p>See the <a href="/documentation/io/built-in/">Beam-provided I/O Transforms</a> page for a list of the currently available I/O transforms.</p>
 
+<h2 id="extensions">Extensions</h2>
+
+<p>The Java SDK has the following extensions:</p>
+
+<ul>
+  <li><a href="/documentation/sdks/java-extensions/#join-library">join-library</a> provides inner join, outer left join, and outer right join functions.</li>
+  <li><a href="/documentation/sdks/java-extensions/#sorter">sorter</a> is an efficient and scalable sorter for large iterables.</li>
+</ul>
+
       </div>