You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by gi...@apache.org on 2019/06/14 15:43:37 UTC
[beam] branch asf-site updated: Publishing website 2019/06/14
15:43:25 at commit d38a4da
This is an automated email from the ASF dual-hosted git repository.
git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 12b9d47 Publishing website 2019/06/14 15:43:25 at commit d38a4da
12b9d47 is described below
commit 12b9d47882225c7609aa8c712afa2fad44892d89
Author: jenkins <bu...@apache.org>
AuthorDate: Fri Jun 14 15:43:25 2019 +0000
Publishing website 2019/06/14 15:43:25 at commit d38a4da
---
.../capability/2016/03/17/capability-matrix.html | 16 +
.../2016/04/03/presentation-materials.html | 16 +
.../sdk/2016/02/25/python-sdk-now-public.html | 16 +
.../beam/release/2016/06/15/first-release.html | 16 +
.../2016/10/11/strata-hadoop-world-and-beam.html | 16 +
.../update/website/2016/02/22/beam-has-a-logo.html | 16 +
.../blog/2016/05/18/splitAtFraction-method.html | 16 +
.../05/27/where-is-my-pcollection-dot-map.html | 16 +
.../2016/06/13/flink-batch-runner-milestone.html | 16 +
.../blog/2016/08/03/six-months.html | 16 +
.../blog/2016/10/20/test-stream.html | 16 +
.../blog/2017/01/09/added-apex-runner.html | 16 +
.../blog/2017/01/10/beam-graduates.html | 16 +
.../blog/2017/02/01/graduation-media-recap.html | 16 +
.../blog/2017/02/13/stateful-processing.html | 126 +++-
.../blog/2017/03/16/python-sdk-release.html | 16 +
.../blog/2017/05/17/beam-first-stable-release.html | 16 +
.../blog/2017/08/16/splittable-do-fn.html | 16 +
.../blog/2017/08/28/timely-processing.html | 16 +
.../blog/2018/01/09/beam-a-look-back.html | 16 +
.../blog/2018/02/19/beam-2.3.0.html | 16 +
.../blog/2018/06/26/beam-2.5.0.html | 16 +
.../blog/2018/08/10/beam-2.6.0.html | 16 +
.../08/20/review-input-streaming-connectors.html | 16 +
.../blog/2018/08/21/beam-summit-europe.html | 16 +
.../blog/2018/10/03/beam-2.7.0.html | 16 +
.../blog/2018/10/29/beam-2.8.0.html | 16 +
.../blog/2018/10/31/beam-summit-aftermath.html | 16 +
.../blog/2018/12/13/beam-2.9.0.html | 16 +
.../blog/2019/02/15/beam-2.10.0.html | 16 +
.../blog/2019/03/05/beam-2.11.0.html | 16 +
.../blog/2019/03/18/beam-summit-site.html | 16 +
.../blog/2019/04/19/season-of-docs.html | 16 +
.../blog/2019/04/25/beam-2.12.0.html | 16 +
.../blog/2019/04/25/beam-kotlin.html | 16 +
.../blog/2019/05/11/beam-summit-europe-2019.html | 16 +
.../blog/2019/05/22/beam-2.13.0.html | 18 +-
.../blog/2019/05/30/beam-kata-release.html | 16 +
.../2019/06/04/adding-data-sources-to-sql.html | 16 +
.../blog/2019/06/11/looping-timers.html | 590 +++++++++++++++++++
website/generated-content/blog/index.html | 118 +++-
website/generated-content/coming-soon.html | 16 +
.../community/contact-us/index.html | 16 +
.../community/in-person/index.html | 16 +
.../community/integrations/index.html | 16 +
.../generated-content/community/logos/index.html | 16 +
.../community/policies/index.html | 16 +
.../community/presentation-materials/index.html | 16 +
.../community/youtube-channel/index.html | 16 +
.../contribute/become-a-committer/index.html | 16 +
.../contribute/committer-guide/index.html | 16 +
.../contribute/dependencies/index.html | 16 +
.../contribute/design-documents/index.html | 18 +
.../contribute/feature-branches/index.html | 16 +
.../contribute/get-help/index.html | 16 +
website/generated-content/contribute/index.html | 16 +
.../contribute/postcommits-guides/index.html | 16 +
.../postcommits-policies-details/index.html | 16 +
.../contribute/postcommits-policies/index.html | 16 +
.../contribute/precommit-policies/index.html | 16 +
.../contribute/precommit-triage-guide/index.html | 16 +
.../contribute/ptransform-style-guide/index.html | 16 +
.../contribute/release-guide/index.html | 16 +
.../contribute/runner-guide/index.html | 16 +
.../sql/calcite/aggregate-functions/index.html | 16 +
.../dsls/sql/calcite/data-types/index.html | 16 +
.../dsls/sql/calcite/lexical/index.html | 16 +
.../dsls/sql/calcite/overview/index.html | 16 +
.../dsls/sql/calcite/query-syntax/index.html | 16 +
.../dsls/sql/calcite/scalar-functions/index.html | 16 +
.../extensions/create-external-table/index.html | 16 +
.../dsls/sql/extensions/joins/index.html | 16 +
.../dsls/sql/extensions/set/index.html | 16 +
.../extensions/user-defined-functions/index.html | 16 +
.../extensions/windowing-and-triggering/index.html | 16 +
.../documentation/dsls/sql/overview/index.html | 16 +
.../documentation/dsls/sql/shell/index.html | 16 +
.../documentation/dsls/sql/walkthrough/index.html | 16 +
.../documentation/execution-model/index.html | 16 +
website/generated-content/documentation/index.html | 16 +
.../io/built-in/google-bigquery/index.html | 31 +-
.../documentation/io/built-in/hadoop/index.html | 16 +
.../documentation/io/built-in/hcatalog/index.html | 16 +
.../documentation/io/built-in/index.html | 17 +-
.../documentation/io/developing-io-java/index.html | 16 +
.../io/developing-io-overview/index.html | 16 +
.../io/developing-io-python/index.html | 20 +-
.../documentation/io/testing/index.html | 16 +
.../patterns/custom-io-patterns/index.html | 16 +
.../patterns/file-processing-patterns/index.html | 16 +
.../documentation/patterns/overview/index.html | 16 +
.../patterns/pipeline-option-patterns/index.html | 16 +
.../patterns/side-input-patterns/index.html | 16 +
.../pipelines/create-your-pipeline/index.html | 16 +
.../pipelines/design-your-pipeline/index.html | 16 +
.../pipelines/test-your-pipeline/index.html | 16 +
.../documentation/programming-guide/index.html | 85 ++-
.../resources/learning-resources/index.html | 16 +
.../resources/videos-and-podcasts/index.html | 16 +
.../documentation/runners/apex/index.html | 16 +
.../runners/capability-matrix/index.html | 16 +
.../documentation/runners/dataflow/index.html | 16 +
.../documentation/runners/direct/index.html | 16 +
.../documentation/runners/flink/index.html | 16 +
.../documentation/runners/gearpump/index.html | 16 +
.../documentation/runners/jet/index.html | 16 +
.../documentation/runners/jstorm/index.html | 16 +
.../documentation/runners/mapreduce/index.html | 16 +
.../documentation/runners/nemo/index.html | 16 +
.../documentation/runners/samza/index.html | 16 +
.../documentation/runners/spark/index.html | 156 ++++-
.../sdks/feature-comparison/index.html | 16 +
.../documentation/sdks/go/index.html | 16 +
.../sdks/java-dependencies/index.html | 16 +
.../documentation/sdks/java-extensions/index.html | 16 +
.../documentation/sdks/java-thirdparty/index.html | 16 +
.../documentation/sdks/java/euphoria/index.html | 16 +
.../documentation/sdks/java/index.html | 16 +
.../sdks/java/testing/nexmark/index.html | 16 +
.../sdks/python-dependencies/index.html | 55 ++
.../sdks/python-pipeline-dependencies/index.html | 16 +
.../documentation/sdks/python-streaming/index.html | 16 +
.../sdks/python-type-safety/index.html | 16 +
.../documentation/sdks/python/index.html | 16 +
.../aggregation/approximatequantiles/index.html | 16 +
.../aggregation/approximateunique/index.html | 16 +
.../python/aggregation/cogroupbykey/index.html | 16 +
.../python/aggregation/combineglobally/index.html | 16 +
.../aggregation/combinewithcontext/index.html | 16 +
.../transforms/python/aggregation/count/index.html | 16 +
.../python/aggregation/distinct/index.html | 16 +
.../python/aggregation/groupbykey/index.html | 16 +
.../python/aggregation/groupintobatches/index.html | 16 +
.../python/aggregation/latest/index.html | 16 +
.../transforms/python/aggregation/max/index.html | 16 +
.../transforms/python/aggregation/mean/index.html | 16 +
.../transforms/python/aggregation/min/index.html | 16 +
.../python/aggregation/sample/index.html | 16 +
.../transforms/python/aggregation/sum/index.html | 16 +
.../transforms/python/aggregation/top/index.html | 16 +
.../python/elementwise/filter/index.html | 16 +
.../python/elementwise/flatmap/index.html | 16 +
.../transforms/python/elementwise/keys/index.html | 16 +
.../python/elementwise/kvswap/index.html | 16 +
.../transforms/python/elementwise/map/index.html | 16 +
.../transforms/python/elementwise/pardo/index.html | 16 +
.../python/elementwise/partition/index.html | 16 +
.../transforms/python/elementwise/regex/index.html | 16 +
.../transforms/python/elementwise/reify/index.html | 16 +
.../python/elementwise/tostring/index.html | 16 +
.../python/elementwise/values/index.html | 16 +
.../python/elementwise/withkeys/index.html | 16 +
.../python/elementwise/withtimestamps/index.html | 16 +
.../transforms/python/other/create/index.html | 16 +
.../transforms/python/other/flatten/index.html | 16 +
.../transforms/python/other/passert/index.html | 16 +
.../transforms/python/other/reshuffle/index.html | 16 +
.../transforms/python/other/view/index.html | 16 +
.../transforms/python/other/windowinto/index.html | 16 +
.../transforms/python/overview/index.html | 16 +
website/generated-content/feed.xml | 646 ++++++++++++++-------
.../get-started/beam-overview/index.html | 16 +
.../get-started/downloads/index.html | 16 +
website/generated-content/get-started/index.html | 16 +
.../get-started/mobile-gaming-example/index.html | 16 +
.../get-started/quickstart-go/index.html | 16 +
.../get-started/quickstart-java/index.html | 16 +
.../get-started/quickstart-py/index.html | 16 +
.../get-started/try-apache-beam/index.html | 16 +
.../get-started/wordcount-example/index.html | 16 +
website/generated-content/index.html | 34 +-
.../generated-content/privacy_policy/index.html | 16 +
.../roadmap/apex-runner/index.html | 16 +
.../roadmap/connectors-go-sdk/index.html | 16 +
.../roadmap/connectors-java-sdk/index.html | 16 +
.../roadmap/connectors-multi-sdk/index.html | 16 +
.../roadmap/connectors-python-sdk/index.html | 16 +
.../roadmap/dataflow-runner/index.html | 16 +
.../generated-content/roadmap/euphoria/index.html | 16 +
.../roadmap/flink-runner/index.html | 16 +
.../roadmap/gearpump-runner/index.html | 16 +
.../generated-content/roadmap/go-sdk/index.html | 16 +
website/generated-content/roadmap/index.html | 16 +
.../generated-content/roadmap/java-sdk/index.html | 16 +
.../roadmap/nemo-runner/index.html | 16 +
.../roadmap/portability/index.html | 16 +
.../roadmap/python-sdk/index.html | 16 +
.../roadmap/samza-runner/index.html | 16 +
.../roadmap/spark-runner/index.html | 16 +
website/generated-content/roadmap/sql/index.html | 16 +
190 files changed, 4452 insertions(+), 294 deletions(-)
diff --git a/website/generated-content/beam/capability/2016/03/17/capability-matrix.html b/website/generated-content/beam/capability/2016/03/17/capability-matrix.html
index 95e7194..8ab690a 100644
--- a/website/generated-content/beam/capability/2016/03/17/capability-matrix.html
+++ b/website/generated-content/beam/capability/2016/03/17/capability-matrix.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/beam/capability/2016/04/03/presentation-materials.html b/website/generated-content/beam/capability/2016/04/03/presentation-materials.html
index 0d4223e..54a62e2 100644
--- a/website/generated-content/beam/capability/2016/04/03/presentation-materials.html
+++ b/website/generated-content/beam/capability/2016/04/03/presentation-materials.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/beam/python/sdk/2016/02/25/python-sdk-now-public.html b/website/generated-content/beam/python/sdk/2016/02/25/python-sdk-now-public.html
index 8f28154..c88bd47 100644
--- a/website/generated-content/beam/python/sdk/2016/02/25/python-sdk-now-public.html
+++ b/website/generated-content/beam/python/sdk/2016/02/25/python-sdk-now-public.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/beam/release/2016/06/15/first-release.html b/website/generated-content/beam/release/2016/06/15/first-release.html
index f153d46..74f57e4 100644
--- a/website/generated-content/beam/release/2016/06/15/first-release.html
+++ b/website/generated-content/beam/release/2016/06/15/first-release.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/beam/update/2016/10/11/strata-hadoop-world-and-beam.html b/website/generated-content/beam/update/2016/10/11/strata-hadoop-world-and-beam.html
index 5e1ae36..c41e922 100644
--- a/website/generated-content/beam/update/2016/10/11/strata-hadoop-world-and-beam.html
+++ b/website/generated-content/beam/update/2016/10/11/strata-hadoop-world-and-beam.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/beam/update/website/2016/02/22/beam-has-a-logo.html b/website/generated-content/beam/update/website/2016/02/22/beam-has-a-logo.html
index b7ec497..7f36495 100644
--- a/website/generated-content/beam/update/website/2016/02/22/beam-has-a-logo.html
+++ b/website/generated-content/beam/update/website/2016/02/22/beam-has-a-logo.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2016/05/18/splitAtFraction-method.html b/website/generated-content/blog/2016/05/18/splitAtFraction-method.html
index 88c50e1..f8c3e57 100644
--- a/website/generated-content/blog/2016/05/18/splitAtFraction-method.html
+++ b/website/generated-content/blog/2016/05/18/splitAtFraction-method.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2016/05/27/where-is-my-pcollection-dot-map.html b/website/generated-content/blog/2016/05/27/where-is-my-pcollection-dot-map.html
index 8c59969..1ac928c 100644
--- a/website/generated-content/blog/2016/05/27/where-is-my-pcollection-dot-map.html
+++ b/website/generated-content/blog/2016/05/27/where-is-my-pcollection-dot-map.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2016/06/13/flink-batch-runner-milestone.html b/website/generated-content/blog/2016/06/13/flink-batch-runner-milestone.html
index e631aea..2857be2 100644
--- a/website/generated-content/blog/2016/06/13/flink-batch-runner-milestone.html
+++ b/website/generated-content/blog/2016/06/13/flink-batch-runner-milestone.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2016/08/03/six-months.html b/website/generated-content/blog/2016/08/03/six-months.html
index f954541..b360df8 100644
--- a/website/generated-content/blog/2016/08/03/six-months.html
+++ b/website/generated-content/blog/2016/08/03/six-months.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2016/10/20/test-stream.html b/website/generated-content/blog/2016/10/20/test-stream.html
index cfd1eed..87e9444 100644
--- a/website/generated-content/blog/2016/10/20/test-stream.html
+++ b/website/generated-content/blog/2016/10/20/test-stream.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2017/01/09/added-apex-runner.html b/website/generated-content/blog/2017/01/09/added-apex-runner.html
index b6e6d5c..b7cb326 100644
--- a/website/generated-content/blog/2017/01/09/added-apex-runner.html
+++ b/website/generated-content/blog/2017/01/09/added-apex-runner.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2017/01/10/beam-graduates.html b/website/generated-content/blog/2017/01/10/beam-graduates.html
index 2746d7a..98ae84d 100644
--- a/website/generated-content/blog/2017/01/10/beam-graduates.html
+++ b/website/generated-content/blog/2017/01/10/beam-graduates.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2017/02/01/graduation-media-recap.html b/website/generated-content/blog/2017/02/01/graduation-media-recap.html
index a30da91..aec39c2 100644
--- a/website/generated-content/blog/2017/02/01/graduation-media-recap.html
+++ b/website/generated-content/blog/2017/02/01/graduation-media-recap.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2017/02/13/stateful-processing.html b/website/generated-content/blog/2017/02/13/stateful-processing.html
index a484e87..397411c 100644
--- a/website/generated-content/blog/2017/02/13/stateful-processing.html
+++ b/website/generated-content/blog/2017/02/13/stateful-processing.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -179,6 +195,9 @@ efficiencies. In this post, I will guide you through stateful processing in
Beam: how it works, how it fits in with the other features of the Beam model,
what you might use it for, and what it looks like in code.</p>
+<p><strong>Note: This post has been updated in May of 2019, to include Python
+snippets!</strong></p>
+
<!--more-->
<blockquote>
@@ -444,7 +463,7 @@ on a per key-and-window basis:</p>
<span class="c1">// A state cell holding a single Integer per key+window</span>
<span class="nd">@StateId</span><span class="o">(</span><span class="s">"index"</span><span class="o">)</span>
- <span class="kd">private</span> <span class="kd">final</span> <span class="n">StateSpec</span><span class="o"><</span><span class="n">ValueState</span><span class="o"><</span><span class="n">Integer</span><span class="o">>></span> <span class="n">indexSpec</span> <span class="o">=</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span class="n">StateSpec</span><span class="o"><</span><span class="n">ValueState</span><span class="o"><</span><span class="n">Integer</span><span class="o">>></span> <span class="n">indexSpec</span> <span class="o">=</span>
<span class="n">StateSpecs</span><span class="o">.</span><span class="na">value</span><span class="o">(</span><span class="n">VarIntCoder</span><span class="o">.</span><span class="na">of</span><span class="o">());</span>
<span class="nd">@ProcessElement</span>
@@ -459,8 +478,14 @@ on a per key-and-window basis:</p>
</code></pre>
</div>
-<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="c"># State and timers are not yet supported in Beam's Python SDK.</span>
-<span class="c"># Watch this space!</span>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="k">class</span> <span class="nc">IndexAssigningStatefulDoFn</span><span class="p">(</span><span class="n">DoFn</span><span class="p">):</span>
+ <span class="n">INDEX_STATE</span> <span class="o">=</span> <span class="n">CombiningStateSpec</span><span class="p">(</span><span class="s">'index'</span><span class="p">,</span> <span class="nb">sum</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="n">DoFn</span><span class="o">.</span><span class="n">StateParam</span><span class="p">(</span><span class="n">INDEX_STATE</span><span class="p">)):</span>
+ <span class="n">unused_key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">element</span>
+ <span class="n">current_index</span> <span class="o">=</span> <span class="n">index</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="k">yield</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">current_index</span><span class="p">)</span>
+ <span class="n">index</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</code></pre>
</div>
@@ -541,8 +566,20 @@ look something like this:</p>
</code></pre>
</div>
-<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="c"># State and timers are not yet supported in Beam's Python SDK.</span>
-<span class="c"># Watch this space!</span>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ModelFromEventsFn</span><span class="p">(</span><span class="n">apache_beam</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">CombineFn</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="nf">create_accumulator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c"># Create a new empty model</span>
+ <span class="k">return</span> <span class="n">Model</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">add_input</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">model</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">merge_accumulators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">accumulators</span><span class="p">):</span>
+ <span class="c"># Custom merging logic</span>
+
+ <span class="k">def</span> <span class="nf">extract_output</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">model</span>
</code></pre>
</div>
@@ -577,8 +614,24 @@ against it, outputting the prediction, like so:</p>
</code></pre>
</div>
-<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="c"># State and timers are not yet supported in Beam's Python SDK.</span>
-<span class="c"># Watch this space!</span>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="c"># Events is a collection of (user, event) pairs.</span>
+<span class="n">events</span> <span class="o">=</span> <span class="p">(</span><span class="n">p</span> <span class="o">|</span> <span class="n">ReadFromEventSource</span><span class="p">()</span> <span class="o">|</span> <span class="n">beam</span><span class="o">.</span><span class="n">WindowInto</span><span class="p">(</span><span class="o">....</span><span class="p">))</span>
+
+<span class="n">user_models</span> <span class="o">=</span> <span class="n">beam</span><span class="o">.</span><span class="n">pvalue</span><span class="o">.</span><span class="n">AsDict</span><span class="p">(</span>
+ <span class="n">events</span>
+ <span class="o">|</span> <span class="n">beam</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">CombinePerKey</span><span class="p">(</span><span class="n">ModelFromEventsFn</span><span class="p">()))</span>
+
+<span class="k">def</span> <span class="nf">event_prediction</span><span class="p">(</span><span class="n">user_event</span><span class="p">,</span> <span class="n">models</span><span class="p">):</span>
+ <span class="n">user</span> <span class="o">=</span> <span class="n">user_event</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">event</span> <span class="o">=</span> <span class="n">user_event</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+
+ <span class="c"># Retrieve the model calculated for this user</span>
+ <span class="n">model</span> <span class="o">=</span> <span class="n">models</span><span class="p">[</span><span class="n">user</span><span class="p">]</span>
+
+ <span class="k">return</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">prediction</span><span class="p">(</span><span class="n">event</span><span class="p">))</span>
+
+<span class="c"># Predictions is a collection of (user, prediction) pairs.</span>
+<span class="n">predictions</span> <span class="o">=</span> <span class="n">events</span> <span class="o">|</span> <span class="n">beam</span><span class="o">.</span><span class="n">Map</span><span class="p">(</span><span class="n">event_prediction</span><span class="p">,</span> <span class="n">user_models</span><span class="p">)</span>
</code></pre>
</div>
@@ -611,8 +664,15 @@ after input arrives:</p>
</code></pre>
</div>
-<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="c"># State and timers are not yet supported in Beam's Python SDK.</span>
-<span class="c"># Watch this space!</span>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="n">events</span> <span class="o">=</span> <span class="o">...</span>
+
+<span class="n">user_models</span> <span class="o">=</span> <span class="n">beam</span><span class="o">.</span><span class="n">pvalue</span><span class="o">.</span><span class="n">AsDict</span><span class="p">(</span>
+ <span class="n">events</span>
+ <span class="o">|</span> <span class="n">beam</span><span class="o">.</span><span class="n">WindowInto</span><span class="p">(</span><span class="n">GlobalWindows</span><span class="p">(),</span>
+ <span class="n">trigger</span><span class="o">=</span><span class="n">trigger</span><span class="o">.</span><span class="n">AfterAll</span><span class="p">(</span>
+ <span class="n">trigger</span><span class="o">.</span><span class="n">AfterCount</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span>
+ <span class="n">trigger</span><span class="o">.</span><span class="n">AfterProcessingTime</span><span class="p">(</span><span class="mi">1</span><span class="p">)))</span>
+ <span class="o">|</span> <span class="n">beam</span><span class="o">.</span><span class="n">CombinePerKey</span><span class="p">(</span><span class="n">ModelFromEventsFn</span><span class="p">()))</span>
</code></pre>
</div>
@@ -669,8 +729,31 @@ only features I have already introduced:</p>
</code></pre>
</div>
-<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="c"># State and timers are not yet supported in Beam's Python SDK.</span>
-<span class="c"># Watch this space!</span>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ModelStatefulFn</span><span class="p">(</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="p">):</span>
+
+ <span class="n">PREVIOUS_PREDICTION</span> <span class="o">=</span> <span class="n">BagStateSpec</span><span class="p">(</span><span class="s">'previous_pred_state'</span><span class="p">,</span> <span class="n">PredictionCoder</span><span class="p">())</span>
+ <span class="n">MODEL_STATE</span> <span class="o">=</span> <span class="n">CombiningValueStateSpec</span><span class="p">(</span><span class="s">'model_state'</span><span class="p">,</span>
+ <span class="n">ModelCoder</span><span class="p">(),</span>
+ <span class="n">ModelFromEventsFn</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
+ <span class="n">user_event</span><span class="p">,</span>
+ <span class="n">previous_pred_state</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">StateParam</span><span class="p">(</span><span class="n">PREVIOUS_PREDICTION</span><span class="p">),</span>
+ <span class="n">model_state</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">StateParam</span><span class="p">(</span><span class="n">MODEL_STATE</span><span class="p">)):</span>
+ <span class="n">user</span> <span class="o">=</span> <span class="n">user_event</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">event</span> <span class="o">=</span> <span class="n">user_event</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">model</span> <span class="o">=</span> <span class="n">model_state</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="n">previous_prediction</span> <span class="o">=</span> <span class="n">previous_pred_state</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+ <span class="n">new_prediction</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">prediction</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+ <span class="n">model_state</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="p">(</span><span class="n">previous_prediction</span> <span class="ow">is</span> <span class="bp">None</span>
+ <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">should_output_prediction</span><span class="p">(</span>
+ <span class="n">previous_prediction</span><span class="p">,</span> <span class="n">new_prediction</span><span class="p">)):</span>
+ <span class="n">previous_pred_state</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+ <span class="n">previous_pred_state</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">new_prediction</span><span class="p">)</span>
+ <span class="k">yield</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">new_prediction</span><span class="p">)</span>
</code></pre>
</div>
@@ -682,20 +765,21 @@ state of the model for a user and <code class="highlighter-rouge">@StateId("prev
the prediction output previously.</li>
<li>Access to the two state cells by annotation in the <code class="highlighter-rouge">@ProcessElement</code> method
is as before.</li>
- <li>You read the current model via <code class="highlighter-rouge">modelState.read()</code>. Because state is also
-per-key-and-window, this is a model just for the UserId of the Event
+ <li>You read the current model via <code class="highlighter-rouge">modelState.read()</code>.
+per-key-and-window, this is a model just for the UserId of the Event
currently being processed.</li>
<li>You derive a new prediction <code class="highlighter-rouge">model.prediction(event)</code> and compare it against
-the last one you output, accessed via <code class="highlighter-rouge">previousPredicationState.read()</code>.</li>
+the last one you output, accessed via
+<code class="highlighter-rouge">previousPredicationState.read()</code>.</li>
<li>You then update the model <code class="highlighter-rouge">model.update()</code> and write it via
-<code class="highlighter-rouge">modelState.write(...)</code>. It is perfectly fine to mutate the value you pulled
-out of state as long as you also remember to write the mutated value, in the
-same way you are encouraged to mutate <code class="highlighter-rouge">CombineFn</code> accumulators.</li>
+<code class="highlighter-rouge">modelState.write(...)</code>. It is perfectly fine to mutate the value
+you pulled out of state as long as you also remember to write the mutated
+value, in the same way you are encouraged to mutate <code class="highlighter-rouge">CombineFn</code> accumulators.</li>
<li>If the prediction has changed a significant amount since the last time you
-output, you emit it via <code class="highlighter-rouge">context.output(...)</code> and save the prediction using
-<code class="highlighter-rouge">previousPredictionState.write(...)</code>. Here the decision is relative to the
-prior prediction output, not the last one computed - realistically you might
-have some complex conditions here.</li>
+output, you emit it via <code class="highlighter-rouge">context.output(...)</code> and
+save the prediction using <code class="highlighter-rouge">previousPredictionState.write(...)</code>.
+Here the decision is relative to the prior prediction output, not the last
+one computed - realistically you might have some complex conditions here.</li>
</ul>
<p>Most of the above is just talking through Java! But before you go out and
diff --git a/website/generated-content/blog/2017/03/16/python-sdk-release.html b/website/generated-content/blog/2017/03/16/python-sdk-release.html
index 02450f2..5597869 100644
--- a/website/generated-content/blog/2017/03/16/python-sdk-release.html
+++ b/website/generated-content/blog/2017/03/16/python-sdk-release.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2017/05/17/beam-first-stable-release.html b/website/generated-content/blog/2017/05/17/beam-first-stable-release.html
index 813a8c7..813720d 100644
--- a/website/generated-content/blog/2017/05/17/beam-first-stable-release.html
+++ b/website/generated-content/blog/2017/05/17/beam-first-stable-release.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2017/08/16/splittable-do-fn.html b/website/generated-content/blog/2017/08/16/splittable-do-fn.html
index 733e72f..7bc28c9 100644
--- a/website/generated-content/blog/2017/08/16/splittable-do-fn.html
+++ b/website/generated-content/blog/2017/08/16/splittable-do-fn.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2017/08/28/timely-processing.html b/website/generated-content/blog/2017/08/28/timely-processing.html
index 5c25788..7ba1acf 100644
--- a/website/generated-content/blog/2017/08/28/timely-processing.html
+++ b/website/generated-content/blog/2017/08/28/timely-processing.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/01/09/beam-a-look-back.html b/website/generated-content/blog/2018/01/09/beam-a-look-back.html
index c51dd95..fd145c1 100644
--- a/website/generated-content/blog/2018/01/09/beam-a-look-back.html
+++ b/website/generated-content/blog/2018/01/09/beam-a-look-back.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/02/19/beam-2.3.0.html b/website/generated-content/blog/2018/02/19/beam-2.3.0.html
index 1cb71a4..332975f 100644
--- a/website/generated-content/blog/2018/02/19/beam-2.3.0.html
+++ b/website/generated-content/blog/2018/02/19/beam-2.3.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/06/26/beam-2.5.0.html b/website/generated-content/blog/2018/06/26/beam-2.5.0.html
index 4af51a6..eef85f3 100644
--- a/website/generated-content/blog/2018/06/26/beam-2.5.0.html
+++ b/website/generated-content/blog/2018/06/26/beam-2.5.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/08/10/beam-2.6.0.html b/website/generated-content/blog/2018/08/10/beam-2.6.0.html
index e8a152c..ffe0829 100644
--- a/website/generated-content/blog/2018/08/10/beam-2.6.0.html
+++ b/website/generated-content/blog/2018/08/10/beam-2.6.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/08/20/review-input-streaming-connectors.html b/website/generated-content/blog/2018/08/20/review-input-streaming-connectors.html
index 23b6831..dcb9425 100644
--- a/website/generated-content/blog/2018/08/20/review-input-streaming-connectors.html
+++ b/website/generated-content/blog/2018/08/20/review-input-streaming-connectors.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/08/21/beam-summit-europe.html b/website/generated-content/blog/2018/08/21/beam-summit-europe.html
index d2c5b0e..667dc61 100644
--- a/website/generated-content/blog/2018/08/21/beam-summit-europe.html
+++ b/website/generated-content/blog/2018/08/21/beam-summit-europe.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/10/03/beam-2.7.0.html b/website/generated-content/blog/2018/10/03/beam-2.7.0.html
index add12b7..8f69e1f 100644
--- a/website/generated-content/blog/2018/10/03/beam-2.7.0.html
+++ b/website/generated-content/blog/2018/10/03/beam-2.7.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/10/29/beam-2.8.0.html b/website/generated-content/blog/2018/10/29/beam-2.8.0.html
index 639a08e..2a338a6 100644
--- a/website/generated-content/blog/2018/10/29/beam-2.8.0.html
+++ b/website/generated-content/blog/2018/10/29/beam-2.8.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/10/31/beam-summit-aftermath.html b/website/generated-content/blog/2018/10/31/beam-summit-aftermath.html
index a46a7b6..341b6e3 100644
--- a/website/generated-content/blog/2018/10/31/beam-summit-aftermath.html
+++ b/website/generated-content/blog/2018/10/31/beam-summit-aftermath.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2018/12/13/beam-2.9.0.html b/website/generated-content/blog/2018/12/13/beam-2.9.0.html
index 1318e36..eac254b 100644
--- a/website/generated-content/blog/2018/12/13/beam-2.9.0.html
+++ b/website/generated-content/blog/2018/12/13/beam-2.9.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/02/15/beam-2.10.0.html b/website/generated-content/blog/2019/02/15/beam-2.10.0.html
index 7665ad1..a703889 100644
--- a/website/generated-content/blog/2019/02/15/beam-2.10.0.html
+++ b/website/generated-content/blog/2019/02/15/beam-2.10.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/03/05/beam-2.11.0.html b/website/generated-content/blog/2019/03/05/beam-2.11.0.html
index 42ae77a..619285e 100644
--- a/website/generated-content/blog/2019/03/05/beam-2.11.0.html
+++ b/website/generated-content/blog/2019/03/05/beam-2.11.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/03/18/beam-summit-site.html b/website/generated-content/blog/2019/03/18/beam-summit-site.html
index e9daf40..0222925 100644
--- a/website/generated-content/blog/2019/03/18/beam-summit-site.html
+++ b/website/generated-content/blog/2019/03/18/beam-summit-site.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/04/19/season-of-docs.html b/website/generated-content/blog/2019/04/19/season-of-docs.html
index b9f2b20..1cf4328 100644
--- a/website/generated-content/blog/2019/04/19/season-of-docs.html
+++ b/website/generated-content/blog/2019/04/19/season-of-docs.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/04/25/beam-2.12.0.html b/website/generated-content/blog/2019/04/25/beam-2.12.0.html
index 6e70e4b..6f4d655 100644
--- a/website/generated-content/blog/2019/04/25/beam-2.12.0.html
+++ b/website/generated-content/blog/2019/04/25/beam-2.12.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/04/25/beam-kotlin.html b/website/generated-content/blog/2019/04/25/beam-kotlin.html
index 1f1b1d2..771b281 100644
--- a/website/generated-content/blog/2019/04/25/beam-kotlin.html
+++ b/website/generated-content/blog/2019/04/25/beam-kotlin.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/05/11/beam-summit-europe-2019.html b/website/generated-content/blog/2019/05/11/beam-summit-europe-2019.html
index cc74110..444ef59 100644
--- a/website/generated-content/blog/2019/05/11/beam-summit-europe-2019.html
+++ b/website/generated-content/blog/2019/05/11/beam-summit-europe-2019.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/05/22/beam-2.13.0.html b/website/generated-content/blog/2019/05/22/beam-2.13.0.html
index 74d9cf7..c433951 100644
--- a/website/generated-content/blog/2019/05/22/beam-2.13.0.html
+++ b/website/generated-content/blog/2019/05/22/beam-2.13.0.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -151,7 +167,7 @@
<header class="post-header">
<h1 class="post-title" itemprop="name headline">Apache Beam 2.13.0</h1>
- <p class="post-meta"><time datetime="2019-05-22T01:00:01-07:00" itemprop="datePublished">May 22, 2019</time> •
+ <p class="post-meta"><time datetime="2019-06-07T01:00:01-07:00" itemprop="datePublished">Jun 7, 2019</time> •
</p>
diff --git a/website/generated-content/blog/2019/05/30/beam-kata-release.html b/website/generated-content/blog/2019/05/30/beam-kata-release.html
index 026c2c3..e514dd8 100644
--- a/website/generated-content/blog/2019/05/30/beam-kata-release.html
+++ b/website/generated-content/blog/2019/05/30/beam-kata-release.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/06/04/adding-data-sources-to-sql.html b/website/generated-content/blog/2019/06/04/adding-data-sources-to-sql.html
index 234f30a..1d3bd08 100644
--- a/website/generated-content/blog/2019/06/04/adding-data-sources-to-sql.html
+++ b/website/generated-content/blog/2019/06/04/adding-data-sources-to-sql.html
@@ -107,6 +107,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/blog/2019/06/11/looping-timers.html b/website/generated-content/blog/2019/06/11/looping-timers.html
new file mode 100644
index 0000000..e749a64
--- /dev/null
+++ b/website/generated-content/blog/2019/06/11/looping-timers.html
@@ -0,0 +1,590 @@
+<!DOCTYPE html>
+<!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+
+<html lang="en">
+ <!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+
+<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>Looping timers in Apache Beam</title>
+ <meta name="description" content="Apache Beam’s primitives let you build expressive data pipelines, suitable for avariety of use cases. One specific use case is the analysis of time series da...">
+ <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400" rel="stylesheet">
+ <link rel="stylesheet" href="/css/site.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>
+ <script src="/js/fix-menu.js"></script>
+ <script src="/js/section-nav.js"></script>
+ <script src="/js/page-nav.js"></script>
+ <link rel="canonical" href="https://beam.apache.org/blog/2019/06/11/looping-timers.html" data-proofer-ignore>
+ <link rel="shortcut icon" type="image/x-icon" href="/images/favicon.ico">
+ <link rel="alternate" type="application/rss+xml" title="Apache Beam" href="https://beam.apache.org/feed.xml">
+ <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css" integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz" crossorigin="anonymous">
+ <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>
+</head>
+
+ <body class="body ">
+ <!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+
+<nav class="header navbar navbar-fixed-top">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" 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>
+
+ <a href="/" class="navbar-brand" >
+ <img alt="Brand" style="height: 25px" src="/images/beam_logo_navbar.png">
+ </a>
+ </div>
+
+ <div class="navbar-mask closed"></div>
+
+ <div id="navbar" class="navbar-container closed">
+ <ul class="nav navbar-nav">
+ <li>
+ <a href="/get-started/beam-overview/">Get Started</a>
+ </li>
+ <li>
+ <a href="/documentation/">Documentation</a>
+ </li>
+ <li>
+ <a href="/documentation/sdks/java/">Languages</a>
+ </li>
+ <li>
+ <a href="/documentation/runners/capability-matrix/">RUNNERS</a>
+ </li>
+ <li>
+ <a href="/roadmap/">Roadmap</a>
+ </li>
+ <li>
+ <a href="/contribute/">Contribute</a>
+ </li>
+ <li>
+ <a href="/community/contact-us/">Community</a>
+ </li>
+ <li><a href="/blog">Blog</a></li>
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
+ <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:20px;"><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>
+ <li>
+ <!--
+ data-proofer-ignore disables link checking from website test automation.
+ GitHub links will not resolve until the markdown source is available on the master branch.
+ New pages would fail validation during development / PR test automation.
+ -->
+ <a href="https://github.com/apache/beam/edit/master/website/src/_posts/2019-06-11-looping-timers.md" data-proofer-ignore>
+ <i class="far fa-edit fa-lg" alt="Edit on GitHub" title="Edit on GitHub"></i>
+ </a>
+ </li>
+ </ul>
+ </div>
+</nav>
+
+ <div class="body__contained">
+ <!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+
+
+
+<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
+
+ <header class="post-header">
+ <h1 class="post-title" itemprop="name headline">Looping timers in Apache Beam</h1>
+ <p class="post-meta"><time datetime="2019-06-11T01:00:01-07:00" itemprop="datePublished">Jun 11, 2019</time> •
+ Reza Rokni [<a href="https://twitter.com/rarokni">@rarokni</a>] & Kenneth Knowles [<a href="https://twitter.com/KennKnowles">@KennKnowles</a>]
+
+ </p>
+ </header>
+
+ <div class="post-content" itemprop="articleBody">
+ <!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<p>Apache Beam’s primitives let you build expressive data pipelines, suitable for a
+variety of use cases. One specific use case is the analysis of time series data
+in which continuous sequences across window boundaries are important. A few fun
+challenges arise as you tackle this type of data and in this blog we will
+explore one of those in more detail and make use of the Timer API
+(<a href="/blog/2017/08/28/timely-processing.html">blog post</a>)
+using the “looping timer” pattern.</p>
+
+<!--more-->
+
+<p>With Beam in streaming mode, you can take streams of data and build analytical
+transforms to produce results on the data. But for time series data, the absence
+of data is useful information. So how can we produce results in the absence of
+data?</p>
+
+<p>Let’s use a more concrete example to illustrate the requirement. Imagine you
+have a simple pipeline that sums the number of events coming from an IoT device
+every minute. We would like to produce the value 0 when no data has been seen
+within a specific time interval. So why can this get tricky? Well it is easy to
+build a simple pipeline that counts events as they arrive, but when there is no
+event, there is nothing to count!</p>
+
+<p>Let’s build a simple pipeline to work with:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> // We will start our timer at 1 sec from the fixed upper boundary of our
+ // minute window
+ Instant now = Instant.parse("2000-01-01T00:00:59Z");
+
+ // ----- Create some dummy data
+
+ // Create 3 elements, incrementing by 1 minute and leaving a time gap between
+ // element 2 and element 3
+ TimestampedValue<KV<String, Integer>> time_1 =
+ TimestampedValue.of(KV.of("Key_A", 1), now);
+
+ TimestampedValue<KV<String, Integer>> time_2 =
+ TimestampedValue.of(KV.of("Key_A", 2),
+ now.plus(Duration.standardMinutes(1)));
+
+ // No Value for start time + 2 mins
+ TimestampedValue<KV<String, Integer>> time_3 =
+ TimestampedValue.of(KV.of("Key_A", 3),
+ now.plus(Duration.standardMinutes(3)));
+
+ // Create pipeline
+ PipelineOptions options = PipelineOptionsFactory.fromArgs(args).withValidation()
+ .as(PipelineOptions.class);
+
+ Pipeline p = Pipeline.create(options);
+
+ // Apply a fixed window of duration 1 min and Sum the results
+ p.apply(Create.timestamped(time_1, time_2, time_3))
+ .apply(
+ Window.<KV<String,Integer>>into(
+FixedWindows.<Integer>of(Duration.standardMinutes(1))))
+ .apply(Sum.integersPerKey())
+ .apply(ParDo.of(new DoFn<KV<String, Integer>, KV<String, Integer>>() {
+
+ @ProcessElement public void process(ProcessContext c) {
+ LOG.info("Value is {} timestamp is {}", c.element(), c.timestamp());
+ }
+ }));
+
+ p.run();
+</code></pre>
+</div>
+
+<p>Running that pipeline will result in the following output:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>INFO LoopingTimer - Value is KV{Key_A, 1} timestamp is 2000-01-01T00:00:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 3} timestamp is 2000-01-01T00:03:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 2} timestamp is 2000-01-01T00:01:59.999Z
+</code></pre>
+</div>
+
+<blockquote>
+ <p>Note: The lack of order in the output should be expected, however the
+key-window tuple is correctly computed.</p>
+</blockquote>
+
+<p>As expected, we see output in each of the interval windows which had a data
+point with a timestamp between the minimum and maximum value of the window.
+There was a data point at timestamps 00:00:59, 00:01:59 and 00:03:59, which
+fell into the following interval windows.</p>
+
+<ul>
+ <li>[00:00:00, 00:00:59.999)</li>
+ <li>[00:01:00, 00:01:59.999)</li>
+ <li>[00:03:00, 00:03:59.999)</li>
+</ul>
+
+<p>But as there was no data between 00:02:00 and 00:02:59, no value is produced
+for interval window [00:02:00,00:02:59.999).</p>
+
+<p>How can we get Beam to output values for that missing window? First, let’s walk
+through some options that do not make use of the Timer API.</p>
+
+<h2 id="option-1-external-heartbeat">Option 1: External heartbeat</h2>
+
+<p>We can use an external system to emit a value for each time interval and inject
+it into the stream of data that Beam consumes. This simple option moves any
+complexity out of the Beam pipeline. But using an external system means we need
+to monitor this system and perform other maintenance tasks in tandem with the
+Beam pipeline.</p>
+
+<h2 id="option-2-use-a-generated-source-in-the-beam-pipeline">Option 2: Use a generated source in the Beam pipeline</h2>
+
+<p>We can use a generating source to emit the value using this code snippet:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>pipeline.apply(GenerateSequence.
+ from(0).withRate(1,Duration.standardSeconds(1L)))
+</code></pre>
+</div>
+
+<p>We can then:</p>
+
+<ol>
+ <li>Use a DoFn to convert the value to zero.</li>
+ <li>Flatten this value with the real source.</li>
+ <li>Produce a PCollection which has ticks in every time interval.</li>
+</ol>
+
+<p>This is also a simple way of producing a value in each time interval.</p>
+
+<h2 id="option-1--2-the-problem-with-multiple-keys">Option 1 & 2 The problem with multiple keys</h2>
+
+<p>Both options 1 and 2 work well for the case where there the pipeline processes a
+single key. Let’s now deal with the case where instead of 1 IoT device, there
+are 1000s or 100,000s of these devices, each with a unique key. To make option 1
+or option 2 work in this scenario, we need to carry out an extra step: creating
+a FanOut DoFn. Each tick needs to be distributed to all the potential keys, so
+we need to create a FanOut DoFn that takes the dummy value and generates a
+key-value pair for every available key.</p>
+
+<p>For example, let’s assume we have 3 keys for 3 IoT devices, {key1,key2,key3}.
+Using the method we outlined in Option 2 when we get the first element from
+GenerateSequence, we need to create a loop in the DoFn that generates 3
+key-value pairs. These pairs become the heartbeat value for each of the IoT
+devices.</p>
+
+<p>And things get a lot more fun when we need to deal with lots of IoT devices,
+with a list of keys that are dynamically changing. We would need to add a
+transform that does a Distinct operation and feed the data produced as a
+side-input into the FanOut DoFn.</p>
+
+<h2 id="option-3-implementing-a-heartbeat-using-beam-timers">Option 3: Implementing a heartbeat using Beam timers</h2>
+
+<p>So how do timers help? Well let’s have a look at a new transform:</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">LoopingStatefulTimer</span> <span class="kd">extends</span> <span class="n">DoFn</span><span class="o"><</span><span class="n">KV</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Integer</span><span class="o">>,</span> <span class="n">KV</span><span [...]
+
+ <span class="n">Instant</span> <span class="n">stopTimerTime</span><span class="o">;</span>
+
+ <span class="n">LoopingStatefulTimer</span><span class="o">(</span><span class="n">Instant</span> <span class="n">stopTime</span><span class="o">){</span>
+ <span class="k">this</span><span class="o">.</span><span class="na">stopTimerTime</span> <span class="o">=</span> <span class="n">stopTime</span><span class="o">;</span>
+ <span class="o">}</span>
+
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"timerRunning"</span><span class="o">)</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span class="n">StateSpec</span><span class="o"><</span><span class="n">ValueState</span><span class="o"><</span><span class="n">Boolean</span><span class="o">>></span> <span class="n">timerRunning</span> <span class="o">=</span>
+ <span class="n">StateSpecs</span><span class="o">.</span><span class="na">value</span><span class="o">(</span><span class="n">BooleanCoder</span><span class="o">.</span><span class="na">of</span><span class="o">());</span>
+
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"key"</span><span class="o">)</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span class="n">StateSpec</span><span class="o"><</span><span class="n">ValueState</span><span class="o"><</span><span class="n">String</span><span class="o">>></span> <span class="n">key</span> <span class="o">=</span>
+ <span class="n">StateSpecs</span><span class="o">.</span><span class="na">value</span><span class="o">(</span><span class="n">StringUtf8Coder</span><span class="o">.</span><span class="na">of</span><span class="o">());</span>
+
+ <span class="nd">@TimerId</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span class="n">TimerSpec</span> <span class="n">loopingTimer</span> <span class="o">=</span>
+ <span class="n">TimerSpecs</span><span class="o">.</span><span class="na">timer</span><span class="o">(</span><span class="n">TimeDomain</span><span class="o">.</span><span class="na">EVENT_TIME</span><span class="o">);</span>
+
+ <span class="nd">@ProcessElement</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">ProcessContext</span> <span class="n">c</span><span class="o">,</span> <span class="nd">@StateId</span><span class="o">(</span><span class="s">"key"</span><span class="o">)</span> <span class="n">ValueState</span><span class="o"><</span><span class="n">String</span><span class="o">></span> <span class="n">key</s [...]
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"timerRunning"</span><span class="o">)</span> <span class="n">ValueState</span><span class="o"><</span><span class="n">Boolean</span><span class="o">></span> <span class="n">timerRunning</span><span class="o">,</span>
+ <span class="nd">@TimerId</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span> <span class="n">Timer</span> <span class="n">loopingTimer</span><span class="o">)</span> <span class="o">{</span>
+
+ <span class="c1">// If the timer has been set already, do not reset</span>
+ <span class="k">if</span> <span class="o">(</span><span class="n">timerRunning</span><span class="o">.</span><span class="na">read</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">loopingTimer</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">c</span><span class="o">.</span><span class="na">timestamp</span><span class="o">().</span><span class="na">plus</span><span class="o">(</span><span class="n">Duration</span><span class="o">.</span><span class="na">standardMinutes</span><span class="o">(</span><span class="mi">1</span><span class="o">)));</span>
+ <span class="n">timerRunning</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
+ <span class="o">}</span>
+
+ <span class="c1">// We need this value so that we can output a value for the correct key in OnTimer</span>
+ <span class="k">if</span> <span class="o">(</span><span class="n">key</span><span class="o">.</span><span class="na">read</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">key</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="n">c</span><span class="o">.</span><span class="na">element</span><span class="o">().</span><span class="na">getKey</span><span class="o">());</span>
+ <span class="o">}</span>
+
+ <span class="n">c</span><span class="o">.</span><span class="na">output</span><span class="o">(</span><span class="n">c</span><span class="o">.</span><span class="na">element</span><span class="o">());</span>
+ <span class="o">}</span>
+
+ <span class="nd">@OnTimer</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span>
+ <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onTimer</span><span class="o">(</span>
+ <span class="n">OnTimerContext</span> <span class="n">c</span><span class="o">,</span>
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"key"</span><span class="o">)</span> <span class="n">ValueState</span><span class="o"><</span><span class="n">String</span><span class="o">></span> <span class="n">key</span><span class="o">,</span>
+ <span class="nd">@TimerId</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span> <span class="n">Timer</span> <span class="n">loopingTimer</span><span class="o">)</span> <span class="o">{</span>
+
+ <span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">"Timer @ {} fired"</span><span class="o">,</span> <span class="n">c</span><span class="o">.</span><span class="na">timestamp</span><span class="o">());</span>
+ <span class="n">c</span><span class="o">.</span><span class="na">output</span><span class="o">(</span><span class="n">KV</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">key</span><span class="o">.</span><span class="na">read</span><span class="o">(),</span> <span class="mi">0</span><span class="o">));</span>
+
+ <span class="c1">// If we do not put in a “time to live” value, then the timer would loop forever</span>
+ <span class="n">Instant</span> <span class="n">nextTimer</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="na">timestamp</span><span class="o">().</span><span class="na">plus</span><span class="o">(</span><span class="n">Duration</span><span class="o">.</span><span class="na">standardMinutes</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span>
+ <span class="k">if</span> <span class="o">(</span><span class="n">nextTimer</span><span class="o">.</span><span class="na">isBefore</span><span class="o">(</span><span class="n">stopTimerTime</span><span class="o">))</span> <span class="o">{</span>
+ <span class="n">loopingTimer</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">nextTimer</span><span class="o">);</span>
+ <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+ <span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span>
+ <span class="s">"Timer not being set as exceeded Stop Timer value {} "</span><span class="o">,</span>
+ <span class="n">stopTimerTime</span><span class="o">);</span>
+ <span class="o">}</span>
+ <span class="o">}</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<p>There are two data values that the state API needs to keep:</p>
+
+<ol>
+ <li>A boolean <code class="highlighter-rouge">timeRunning</code> value used to avoid resetting the timer if it’s
+already running.</li>
+ <li>A “<em>key</em>” state object value that allows us to store the key that we are
+working with. This information will be needed in the <code class="highlighter-rouge">OnTimer</code> event later.</li>
+</ol>
+
+<p>We also have a Timer with the ID <code class="highlighter-rouge">**loopingTimer**</code> that acts as our per
+interval alarm clock. Note that the timer is an <em>event timer</em>. It fires based on
+the watermark, not on the passage of time as the pipeline runs.</p>
+
+<p>Next, let’s unpack what’s happening in the @ProcessElement block:</p>
+
+<p>The first element to come to this block will:</p>
+
+<ol>
+ <li>Set the state of the <code class="highlighter-rouge">timerRunner</code> to True.</li>
+ <li>Write the value of the key from the key-value pair into the key StateValue.</li>
+ <li>The code sets the value of the timer to fire one minute after the elements
+timestamp. Note that the maximum value allowed for this timestamp is
+XX:XX:59.999. This places the maximum alarm value at the upper boundary of
+the next time interval.</li>
+ <li>Finally, we output the data from the <code class="highlighter-rouge">@ProcessElement</code> block using
+<code class="highlighter-rouge">c.output</code>.</li>
+</ol>
+
+<p>In the @OnTimer block, the following occurs:</p>
+
+<ol>
+ <li>The code emits a value with the key pulled from our key StateValue and a
+value of 0. The timestamp of the event corresponds to the event time of the
+timer firing.</li>
+ <li>We set a new timer for one minute from now, unless we are past the
+<code class="highlighter-rouge">stopTimerTime</code> value. Your use case will normally have more complex stopping
+conditions, but we use a simple condition here to allow us to keep the
+illustrated code simple. The topic of stopping conditions is discussed in
+more detail later.</li>
+</ol>
+
+<p>And that’s it, let’s add our transform back into the pipeline:</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code> <span class="c1">// Apply a fixed window of duration 1 min and Sum the results</span>
+ <span class="n">p</span><span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Create</span><span class="o">.</span><span class="na">timestamped</span><span class="o">(</span><span class="n">time_1</span><span class="o">,</span> <span class="n">time_2</span><span class="o">,</span> <span class="n">time_3</span><span class="o">)).</span><span class="na">apply</span><span class="o">(</span>
+ <span class="n">Window</span><span class="o">.<</span><span class="n">KV</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Integer</span><span class="o">>></span><span class="n">into</span><span class="o">(</span><span class="n">FixedWindows</span><span class="o">.<</span><span class="n">Integer</span><span class="o">></span><span class="n">of</span><span class="o">(</span><span class="n">Duration</span><span class=" [...]
+ <span class="c1">// We use a combiner to reduce the number of calls in keyed state</span>
+ <span class="c1">// from all elements to 1 per FixedWindow</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Sum</span><span class="o">.</span><span class="na">integersPerKey</span><span class="o">())</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Window</span><span class="o">.</span><span class="na">into</span><span class="o">(</span><span class="k">new</span> <span class="n">GlobalWindows</span><span class="o">()))</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">ParDo</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">LoopingStatefulTimer</span><span class="o">(</span><span class="n">Instant</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="s">"2000-01-01T00:04:00Z"</span><span class="o">))))</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Window</span><span class="o">.</span><span class="na">into</span><span class="o">(</span><span class="n">FixedWindows</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">Duration</span><span class="o">.</span><span class="na">standardMinutes</span><span class="o">(</span><span class="mi">1</span><span class="o">))))</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Sum</span><span class="o">.</span><span class="na">integersPerKey</span><span class="o">())</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">ParDo</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">DoFn</span><span class="o"><</span><span class="n">KV</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Integer</span><span class="o">>,</span> <span class="n">KV</span><span class="o"><</span><span class [...]
+
+ <span class="nd">@ProcessElement</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">ProcessContext</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span>
+
+ <span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">"Value is {} timestamp is {}"</span><span class="o">,</span> <span class="n">c</span><span class="o">.</span><span class="na">element</span><span class="o">(),</span> <span class="n">c</span><span class="o">.</span><span class="na">timestamp</span><span class="o">());</span>
+
+ <span class="o">}</span>
+ <span class="o">}));</span>
+</code></pre>
+</div>
+
+<ol>
+ <li>In the first part of the pipeline we create FixedWindows and reduce the value
+per key down to a single Sum.</li>
+ <li>Next we re-window the output into a GlobalWindow. Since state and timers are
+per window, they must be set within the window boundary. We want the looping
+timer to span all the fixed windows, so we set it up in the global window.</li>
+ <li>We then add our LoopingStatefulTimer DoFn.</li>
+ <li>Finally, we reapply the FixedWindows and Sum our values.</li>
+</ol>
+
+<p>This pipeline ensures that a value of zero exists for each interval window, even
+if the Source of the pipeline emitted a value in the minimum and maximum
+boundaries of the interval window. This means that we can mark the absence of
+data.</p>
+
+<p>You might question why we use two reducers with multiple <code class="highlighter-rouge">Sum.integersPerKey</code>.
+Why not just use one? Functionally, using one would also produce the correct
+result. However, putting two <code class="highlighter-rouge">Sum.integersPerKey</code> gives us a nice performance
+advantage. It reduces the number of elements from many to just one per time
+interval. This can reduce the number of reads of the State API during the
+<code class="highlighter-rouge">@ProcessElement</code> calls.</p>
+
+<p>Here is the logging output of running our modified pipeline:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>INFO LoopingTimer - Timer @ 2000-01-01T00:01:59.999Z fired
+INFO LoopingTimer - Timer @ 2000-01-01T00:02:59.999Z fired
+INFO LoopingTimer - Timer @ 2000-01-01T00:03:59.999Z fired
+INFO LoopingTimer - Timer not being set as exceeded Stop Timer value 2000-01-01T00:04:00.000Z
+INFO LoopingTimer - Value is KV{Key_A, 1} timestamp is 2000-01-01T00:00:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 0} timestamp is 2000-01-01T00:02:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 2} timestamp is 2000-01-01T00:01:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 3} timestamp is 2000-01-01T00:03:59.999Z
+</code></pre>
+</div>
+
+<p>Yay! We now have output from the time interval [00:01:00, 00:01:59.999), even
+though the source dataset has no elements in that interval.</p>
+
+<p>In this blog, we covered one of the fun areas around time series use cases and
+worked through several options, including an advanced use case of the Timer API.
+Happy looping everyone!</p>
+
+<p><strong>Note:</strong> Looping timers is an interesting new use case for the Timer API and
+runners will need to add support for it with all of their more advanced
+feature sets. You can experiment with this pattern today using the
+DirectRunner. For other runners, please look out for their release notes on
+support for dealing with this use case in production.</p>
+
+<p>(<a href="/documentation/runners/capability-matrix/">Capability Matrix</a>)</p>
+
+<p>Runner specific notes:
+Google Cloud Dataflow Runners Drain feature does not support looping timers (Link to matrix)</p>
+
+ </div>
+
+</article>
+
+ </div>
+ <!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+
+<footer class="footer">
+ <div class="footer__contained">
+ <div class="footer__cols">
+ <div class="footer__cols__col">
+ <div class="footer__cols__col__logo">
+ <img src="/images/beam_logo_circle.svg" class="footer__logo" alt="Beam logo">
+ </div>
+ <div class="footer__cols__col__logo">
+ <img src="/images/apache_logo_circle.svg" class="footer__logo" alt="Apache logo">
+ </div>
+ </div>
+ <div class="footer__cols__col footer__cols__col--md">
+ <div class="footer__cols__col__title">Start</div>
+ <div class="footer__cols__col__link"><a href="/get-started/beam-overview/">Overview</a></div>
+ <div class="footer__cols__col__link"><a href="/get-started/quickstart-java/">Quickstart (Java)</a></div>
+ <div class="footer__cols__col__link"><a href="/get-started/quickstart-py/">Quickstart (Python)</a></div>
+ <div class="footer__cols__col__link"><a href="/get-started/quickstart-go/">Quickstart (Go)</a></div>
+ <div class="footer__cols__col__link"><a href="/get-started/downloads/">Downloads</a></div>
+ </div>
+ <div class="footer__cols__col footer__cols__col--md">
+ <div class="footer__cols__col__title">Docs</div>
+ <div class="footer__cols__col__link"><a href="/documentation/programming-guide/">Concepts</a></div>
+ <div class="footer__cols__col__link"><a href="/documentation/pipelines/design-your-pipeline/">Pipelines</a></div>
+ <div class="footer__cols__col__link"><a href="/documentation/runners/capability-matrix/">Runners</a></div>
+ </div>
+ <div class="footer__cols__col footer__cols__col--md">
+ <div class="footer__cols__col__title">Community</div>
+ <div class="footer__cols__col__link"><a href="/contribute/">Contribute</a></div>
+ <div class="footer__cols__col__link"><a href="https://projects.apache.org/committee.html?beam" target="_blank">Team<img src="/images/external-link-icon.png"
+ width="14" height="14"
+ alt="External link."></a></div>
+ <div class="footer__cols__col__link"><a href="/contribute/presentation-materials/">Media</a></div>
+ </div>
+ <div class="footer__cols__col footer__cols__col--md">
+ <div class="footer__cols__col__title">Resources</div>
+ <div class="footer__cols__col__link"><a href="/blog/">Blog</a></div>
+ <div class="footer__cols__col__link"><a href="/get-started/support/">Support</a></div>
+ <div class="footer__cols__col__link"><a href="https://github.com/apache/beam">GitHub</a></div>
+ </div>
+ </div>
+ </div>
+ <div class="footer__bottom">
+ ©
+ <a href="http://www.apache.org">The Apache Software Foundation</a>
+ | <a href="/privacy_policy">Privacy Policy</a>
+ | <a href="/feed.xml">RSS Feed</a>
+ <br><br>
+ Apache Beam, Apache, Beam, the Beam logo, and the Apache feather logo are
+ either registered trademarks or trademarks of The Apache Software
+ Foundation. All other products or name brands are trademarks of their
+ respective holders, including The Apache Software Foundation.
+ </div>
+</footer>
+
+ </body>
+</html>
diff --git a/website/generated-content/blog/index.html b/website/generated-content/blog/index.html
index bd71d1b..25030ca 100644
--- a/website/generated-content/blog/index.html
+++ b/website/generated-content/blog/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -153,9 +169,9 @@ limitations under the License.
<p>This is the blog for the Apache Beam project. This blog contains news and updates
for the project.</p>
-<h3 id="adding-new-data-sources-to-beam-sql-cli"><a class="post-link" href="/blog/2019/06/04/adding-data-sources-to-sql.html">Adding new Data Sources to Beam SQL CLI</a></h3>
-<p><i>Jun 4, 2019 •
- Pablo Estrada [<a href="https://twitter.com/polecitoem">@polecitoem</a>]
+<h3 id="looping-timers-in-apache-beam"><a class="post-link" href="/blog/2019/06/11/looping-timers.html">Looping timers in Apache Beam</a></h3>
+<p><i>Jun 11, 2019 •
+ Reza Rokni [<a href="https://twitter.com/rarokni">@rarokni</a>] & Kenneth Knowles [<a href="https://twitter.com/KennKnowles">@KennKnowles</a>]
</i></p>
<!--
@@ -172,34 +188,59 @@ See the License for the specific language governing permissions and
limitations under the License.
-->
-<p>A new, exciting feature that came to Apache Beam is the ability to use
-SQL in your pipelines. This is done using Beam’s
-<a href="https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/extensions/sql/SqlTransform.html"><code class="highlighter-rouge">SqlTransform</code></a>
-in Java pipelines.</p>
+<p>Apache Beam’s primitives let you build expressive data pipelines, suitable for a
+variety of use cases. One specific use case is the analysis of time series data
+in which continuous sequences across window boundaries are important. A few fun
+challenges arise as you tackle this type of data and in this blog we will
+explore one of those in more detail and make use of the Timer API
+(<a href="/blog/2017/08/28/timely-processing.html">blog post</a>)
+using the “looping timer” pattern.</p>
-<p>Beam also has a fancy new SQL command line that you can use to query your
-data interactively, be it Batch or Streaming. If you haven’t tried it, check out
-<a href="http://bit.ly/ExploreBeamSQL">http://bit.ly/ExploreBeamSQL</a>.</p>
+<!-- Render a "read more" button if the post is longer than the excerpt -->
-<p>A nice feature of the SQL CLI is that you can use <code class="highlighter-rouge">CREATE EXTERNAL TABLE</code>
-commands to <em>add</em> data sources to be accessed in the CLI. Currently, the CLI
-supports creating tables from BigQuery, PubSub, Kafka, and text files. In this
-post, we explore how to add new data sources, so that you will be able to
-consume data from other Beam sources.</p>
+<p>
+<a class="btn btn-default btn-sm" href="/blog/2019/06/11/looping-timers.html" role="button">
+Read more <span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span>
+</a>
+</p>
+
+<hr />
+
+<h3 id="apache-beam-2130"><a class="post-link" href="/blog/2019/05/22/beam-2.13.0.html">Apache Beam 2.13.0</a></h3>
+<p><i>Jun 7, 2019 •</i></p>
+
+<p></i></p>
+
+<!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<p>We are happy to present the new 2.13.0 release of Beam. This release includes both improvements and new functionality.
+See the <a href="/get-started/downloads/#2130-2019-05-21">download page</a> for this release.</p>
<!-- Render a "read more" button if the post is longer than the excerpt -->
<p>
-<a class="btn btn-default btn-sm" href="/blog/2019/06/04/adding-data-sources-to-sql.html" role="button">
+<a class="btn btn-default btn-sm" href="/blog/2019/05/22/beam-2.13.0.html" role="button">
Read more <span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span>
</a>
</p>
<hr />
-<h3 id="apache-beam-katas"><a class="post-link" href="/blog/2019/05/30/beam-kata-release.html">Apache Beam Katas</a></h3>
-<p><i>May 30, 2019 •
- Henry Suryawirawan [<a href="https://twitter.com/henry_ken">@henry_ken</a>]
+<h3 id="adding-new-data-sources-to-beam-sql-cli"><a class="post-link" href="/blog/2019/06/04/adding-data-sources-to-sql.html">Adding new Data Sources to Beam SQL CLI</a></h3>
+<p><i>Jun 4, 2019 •
+ Pablo Estrada [<a href="https://twitter.com/polecitoem">@polecitoem</a>]
</i></p>
<!--
@@ -216,25 +257,35 @@ See the License for the specific language governing permissions and
limitations under the License.
-->
-<p>We are happy to announce
-<a href="https://github.com/apache/beam/tree/master/learning/katas">Apache Beam Katas</a>, a set of
-interactive Beam coding exercises (i.e. <a href="http://codekata.com/">code katas</a>) that can help you in
-learning Apache Beam concepts and programming model hands-on.</p>
+<p>A new, exciting feature that came to Apache Beam is the ability to use
+SQL in your pipelines. This is done using Beam’s
+<a href="https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/extensions/sql/SqlTransform.html"><code class="highlighter-rouge">SqlTransform</code></a>
+in Java pipelines.</p>
+
+<p>Beam also has a fancy new SQL command line that you can use to query your
+data interactively, be it Batch or Streaming. If you haven’t tried it, check out
+<a href="http://bit.ly/ExploreBeamSQL">http://bit.ly/ExploreBeamSQL</a>.</p>
+
+<p>A nice feature of the SQL CLI is that you can use <code class="highlighter-rouge">CREATE EXTERNAL TABLE</code>
+commands to <em>add</em> data sources to be accessed in the CLI. Currently, the CLI
+supports creating tables from BigQuery, PubSub, Kafka, and text files. In this
+post, we explore how to add new data sources, so that you will be able to
+consume data from other Beam sources.</p>
<!-- Render a "read more" button if the post is longer than the excerpt -->
<p>
-<a class="btn btn-default btn-sm" href="/blog/2019/05/30/beam-kata-release.html" role="button">
+<a class="btn btn-default btn-sm" href="/blog/2019/06/04/adding-data-sources-to-sql.html" role="button">
Read more <span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span>
</a>
</p>
<hr />
-<h3 id="apache-beam-2130"><a class="post-link" href="/blog/2019/05/22/beam-2.13.0.html">Apache Beam 2.13.0</a></h3>
-<p><i>May 22, 2019 •</i></p>
-
-<p></i></p>
+<h3 id="apache-beam-katas"><a class="post-link" href="/blog/2019/05/30/beam-kata-release.html">Apache Beam Katas</a></h3>
+<p><i>May 30, 2019 •
+ Henry Suryawirawan [<a href="https://twitter.com/henry_ken">@henry_ken</a>]
+</i></p>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
@@ -250,13 +301,15 @@ See the License for the specific language governing permissions and
limitations under the License.
-->
-<p>We are happy to present the new 2.13.0 release of Beam. This release includes both improvements and new functionality.
-See the <a href="/get-started/downloads/#2130-2019-05-21">download page</a> for this release.</p>
+<p>We are happy to announce
+<a href="https://github.com/apache/beam/tree/master/learning/katas">Apache Beam Katas</a>, a set of
+interactive Beam coding exercises (i.e. <a href="http://codekata.com/">code katas</a>) that can help you in
+learning Apache Beam concepts and programming model hands-on.</p>
<!-- Render a "read more" button if the post is longer than the excerpt -->
<p>
-<a class="btn btn-default btn-sm" href="/blog/2019/05/22/beam-2.13.0.html" role="button">
+<a class="btn btn-default btn-sm" href="/blog/2019/05/30/beam-kata-release.html" role="button">
Read more <span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span>
</a>
</p>
@@ -1049,6 +1102,9 @@ efficiencies. In this post, I will guide you through stateful processing in
Beam: how it works, how it fits in with the other features of the Beam model,
what you might use it for, and what it looks like in code.</p>
+<p><strong>Note: This post has been updated in May of 2019, to include Python
+snippets!</strong></p>
+
<!-- Render a "read more" button if the post is longer than the excerpt -->
<p>
diff --git a/website/generated-content/coming-soon.html b/website/generated-content/coming-soon.html
index ba20715..08ea441 100644
--- a/website/generated-content/coming-soon.html
+++ b/website/generated-content/coming-soon.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/community/contact-us/index.html b/website/generated-content/community/contact-us/index.html
index 23563ca..2611c98 100644
--- a/website/generated-content/community/contact-us/index.html
+++ b/website/generated-content/community/contact-us/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/community/in-person/index.html b/website/generated-content/community/in-person/index.html
index 4a713b9..7c2da22 100644
--- a/website/generated-content/community/in-person/index.html
+++ b/website/generated-content/community/in-person/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/community/integrations/index.html b/website/generated-content/community/integrations/index.html
index b421c48..89fb033 100644
--- a/website/generated-content/community/integrations/index.html
+++ b/website/generated-content/community/integrations/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/community/logos/index.html b/website/generated-content/community/logos/index.html
index 962267e..480ae6a 100644
--- a/website/generated-content/community/logos/index.html
+++ b/website/generated-content/community/logos/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/community/policies/index.html b/website/generated-content/community/policies/index.html
index 6f2cb55..551a836 100644
--- a/website/generated-content/community/policies/index.html
+++ b/website/generated-content/community/policies/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/community/presentation-materials/index.html b/website/generated-content/community/presentation-materials/index.html
index 29c6b9f..7b0ccfc 100644
--- a/website/generated-content/community/presentation-materials/index.html
+++ b/website/generated-content/community/presentation-materials/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/community/youtube-channel/index.html b/website/generated-content/community/youtube-channel/index.html
index 20658bb..ec4d71c 100644
--- a/website/generated-content/community/youtube-channel/index.html
+++ b/website/generated-content/community/youtube-channel/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/become-a-committer/index.html b/website/generated-content/contribute/become-a-committer/index.html
index 60b9b67..496819e 100644
--- a/website/generated-content/contribute/become-a-committer/index.html
+++ b/website/generated-content/contribute/become-a-committer/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/committer-guide/index.html b/website/generated-content/contribute/committer-guide/index.html
index 6abe8af..65c3410 100644
--- a/website/generated-content/contribute/committer-guide/index.html
+++ b/website/generated-content/contribute/committer-guide/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/dependencies/index.html b/website/generated-content/contribute/dependencies/index.html
index 57fc172..1993bc0 100644
--- a/website/generated-content/contribute/dependencies/index.html
+++ b/website/generated-content/contribute/dependencies/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/design-documents/index.html b/website/generated-content/contribute/design-documents/index.html
index ad56e94..c36e4f0 100644
--- a/website/generated-content/contribute/design-documents/index.html
+++ b/website/generated-content/contribute/design-documents/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -360,6 +376,7 @@ limitations under the License.
<li>Side Input in Universal Reference Runner [<a href="https://docs.google.com/document/d/13N0OJ7QJm81wcgu13pi9GuN29UUxN2iIFn_H8lKpDks">doc</a>]</li>
<li>Spark Portable Runner Overview [<a href="https://docs.google.com/document/d/1j8GERTiHUuc6CzzCXZHc38rBn41uWfATBh2-5JN8hro">doc</a>]</li>
<li>Cross-Language Pipelines & Legacy IO [<a href="https://s.apache.org/beam-cross-language-io">doc</a>]</li>
+ <li>Artifact Staging in Cross-Language Pipelines [<a href="https://docs.google.com/document/d/1XaiNekAY2sptuQRIXpjGAyaYdSc-wlJ-VKjl04c8N48/">doc</a>]</li>
</ul>
<h3 id="build--testing">Build / Testing</h3>
@@ -378,6 +395,7 @@ limitations under the License.
<li>Automation For Beam Dependency Check [<a href="https://docs.google.com/document/d/1rqr_8a9NYZCgeiXpTIwWLCL7X8amPAVfRXsO72BpBwA">doc</a>]</li>
<li>Test performance of core Apache Beam operations [<a href="https://s.apache.org/load-test-basic-operations">doc</a>]</li>
<li>Add static code analysis quality gates to Beam [<a href="https://docs.google.com/document/d/1YbV18mrHujmiLBtadS1WzCVeiI3Lo7W6awWJDA4A98o">doc</a>]</li>
+ <li>Portable batch & streaming load tests in all sdks [<a href="https://s.apache.org/portable-load-tests">doc</a>]</li>
</ul>
<h3 id="python">Python</h3>
diff --git a/website/generated-content/contribute/feature-branches/index.html b/website/generated-content/contribute/feature-branches/index.html
index ad666b2..b83ca32 100644
--- a/website/generated-content/contribute/feature-branches/index.html
+++ b/website/generated-content/contribute/feature-branches/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/get-help/index.html b/website/generated-content/contribute/get-help/index.html
index b1514b8..2692bd0 100644
--- a/website/generated-content/contribute/get-help/index.html
+++ b/website/generated-content/contribute/get-help/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/index.html b/website/generated-content/contribute/index.html
index ce22d54..9c3c176 100644
--- a/website/generated-content/contribute/index.html
+++ b/website/generated-content/contribute/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/postcommits-guides/index.html b/website/generated-content/contribute/postcommits-guides/index.html
index 2b401a0..f506560 100644
--- a/website/generated-content/contribute/postcommits-guides/index.html
+++ b/website/generated-content/contribute/postcommits-guides/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/postcommits-policies-details/index.html b/website/generated-content/contribute/postcommits-policies-details/index.html
index cd7ddda..4c9d99d 100644
--- a/website/generated-content/contribute/postcommits-policies-details/index.html
+++ b/website/generated-content/contribute/postcommits-policies-details/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/postcommits-policies/index.html b/website/generated-content/contribute/postcommits-policies/index.html
index ced7bff..a064839 100644
--- a/website/generated-content/contribute/postcommits-policies/index.html
+++ b/website/generated-content/contribute/postcommits-policies/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/precommit-policies/index.html b/website/generated-content/contribute/precommit-policies/index.html
index cc9f251..c0174d5 100644
--- a/website/generated-content/contribute/precommit-policies/index.html
+++ b/website/generated-content/contribute/precommit-policies/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/precommit-triage-guide/index.html b/website/generated-content/contribute/precommit-triage-guide/index.html
index 9ac9967..b7bbaaf 100644
--- a/website/generated-content/contribute/precommit-triage-guide/index.html
+++ b/website/generated-content/contribute/precommit-triage-guide/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/ptransform-style-guide/index.html b/website/generated-content/contribute/ptransform-style-guide/index.html
index 8c12f4d..df457ee 100644
--- a/website/generated-content/contribute/ptransform-style-guide/index.html
+++ b/website/generated-content/contribute/ptransform-style-guide/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/release-guide/index.html b/website/generated-content/contribute/release-guide/index.html
index bdca303..f308186 100644
--- a/website/generated-content/contribute/release-guide/index.html
+++ b/website/generated-content/contribute/release-guide/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/contribute/runner-guide/index.html b/website/generated-content/contribute/runner-guide/index.html
index 2601e1b..2e942fd 100644
--- a/website/generated-content/contribute/runner-guide/index.html
+++ b/website/generated-content/contribute/runner-guide/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/calcite/aggregate-functions/index.html b/website/generated-content/documentation/dsls/sql/calcite/aggregate-functions/index.html
index e721018..4e50a08 100644
--- a/website/generated-content/documentation/dsls/sql/calcite/aggregate-functions/index.html
+++ b/website/generated-content/documentation/dsls/sql/calcite/aggregate-functions/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/calcite/data-types/index.html b/website/generated-content/documentation/dsls/sql/calcite/data-types/index.html
index e5408a1..f13be8e 100644
--- a/website/generated-content/documentation/dsls/sql/calcite/data-types/index.html
+++ b/website/generated-content/documentation/dsls/sql/calcite/data-types/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/calcite/lexical/index.html b/website/generated-content/documentation/dsls/sql/calcite/lexical/index.html
index 6459e33..4bffda4 100644
--- a/website/generated-content/documentation/dsls/sql/calcite/lexical/index.html
+++ b/website/generated-content/documentation/dsls/sql/calcite/lexical/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/calcite/overview/index.html b/website/generated-content/documentation/dsls/sql/calcite/overview/index.html
index ff31941..19dd82e 100644
--- a/website/generated-content/documentation/dsls/sql/calcite/overview/index.html
+++ b/website/generated-content/documentation/dsls/sql/calcite/overview/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/calcite/query-syntax/index.html b/website/generated-content/documentation/dsls/sql/calcite/query-syntax/index.html
index 46fbe26..0c31afd 100644
--- a/website/generated-content/documentation/dsls/sql/calcite/query-syntax/index.html
+++ b/website/generated-content/documentation/dsls/sql/calcite/query-syntax/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/calcite/scalar-functions/index.html b/website/generated-content/documentation/dsls/sql/calcite/scalar-functions/index.html
index 71b7090..6b8e177 100644
--- a/website/generated-content/documentation/dsls/sql/calcite/scalar-functions/index.html
+++ b/website/generated-content/documentation/dsls/sql/calcite/scalar-functions/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/extensions/create-external-table/index.html b/website/generated-content/documentation/dsls/sql/extensions/create-external-table/index.html
index 4423f23..ef59e72 100644
--- a/website/generated-content/documentation/dsls/sql/extensions/create-external-table/index.html
+++ b/website/generated-content/documentation/dsls/sql/extensions/create-external-table/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/extensions/joins/index.html b/website/generated-content/documentation/dsls/sql/extensions/joins/index.html
index 81255e5..3001a94 100644
--- a/website/generated-content/documentation/dsls/sql/extensions/joins/index.html
+++ b/website/generated-content/documentation/dsls/sql/extensions/joins/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/extensions/set/index.html b/website/generated-content/documentation/dsls/sql/extensions/set/index.html
index 98b6728..25f007f 100644
--- a/website/generated-content/documentation/dsls/sql/extensions/set/index.html
+++ b/website/generated-content/documentation/dsls/sql/extensions/set/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/extensions/user-defined-functions/index.html b/website/generated-content/documentation/dsls/sql/extensions/user-defined-functions/index.html
index 41f7b05..d398863 100644
--- a/website/generated-content/documentation/dsls/sql/extensions/user-defined-functions/index.html
+++ b/website/generated-content/documentation/dsls/sql/extensions/user-defined-functions/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/extensions/windowing-and-triggering/index.html b/website/generated-content/documentation/dsls/sql/extensions/windowing-and-triggering/index.html
index cb57289..7f03a6b 100644
--- a/website/generated-content/documentation/dsls/sql/extensions/windowing-and-triggering/index.html
+++ b/website/generated-content/documentation/dsls/sql/extensions/windowing-and-triggering/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/overview/index.html b/website/generated-content/documentation/dsls/sql/overview/index.html
index 249793d..c1fcce0 100644
--- a/website/generated-content/documentation/dsls/sql/overview/index.html
+++ b/website/generated-content/documentation/dsls/sql/overview/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/shell/index.html b/website/generated-content/documentation/dsls/sql/shell/index.html
index 17d3f20..24a44cd 100644
--- a/website/generated-content/documentation/dsls/sql/shell/index.html
+++ b/website/generated-content/documentation/dsls/sql/shell/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/dsls/sql/walkthrough/index.html b/website/generated-content/documentation/dsls/sql/walkthrough/index.html
index 40c2df3..7a0977f 100644
--- a/website/generated-content/documentation/dsls/sql/walkthrough/index.html
+++ b/website/generated-content/documentation/dsls/sql/walkthrough/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/execution-model/index.html b/website/generated-content/documentation/execution-model/index.html
index abc88ac..82516f8 100644
--- a/website/generated-content/documentation/execution-model/index.html
+++ b/website/generated-content/documentation/execution-model/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/index.html b/website/generated-content/documentation/index.html
index ea40f3e..5cc1601 100644
--- a/website/generated-content/documentation/index.html
+++ b/website/generated-content/documentation/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/io/built-in/google-bigquery/index.html b/website/generated-content/documentation/io/built-in/google-bigquery/index.html
index 6b70e63..3680774 100644
--- a/website/generated-content/documentation/io/built-in/google-bigquery/index.html
+++ b/website/generated-content/documentation/io/built-in/google-bigquery/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -712,10 +728,10 @@ Beam’s support for the BigQuery Storage API has the following limitations:</p>
<ul>
<li>The SDK for Python does not support the BigQuery Storage API.</li>
- <li>You must read from a table. Reading with a query string is not currently
-supported.</li>
<li>Dynamic work re-balancing is not currently supported. As a result, reads might
be less efficient in the presence of stragglers.</li>
+ <li>SDK versions 2.11.0 and 2.12.0 do not support reading with a query string; you
+can only read from a table.</li>
</ul>
<p>Because this is currently a Beam experimental feature, export based reads are
@@ -739,7 +755,7 @@ you must also specify a <a href="https://googleapis.github.io/google-cloud-java/
proto using the <a href="https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.TypedRead.html#withReadOptions-com.google.cloud.bigquery.storage.v1beta1.ReadOptions.TableReadOptions-">withReadOptions</a> method.</li>
</ul>
-<p>The following code snippet is from the <a href="https://github.com/apache/beam/blob/master/examples/java/src/main/java/org/apache/beam/examples/cookbook/BigQueryTornadoes.java">BigQueryTornadoes
+<p>The following code snippet reads from a table. This example is from the <a href="https://github.com/apache/beam/blob/master/examples/java/src/main/java/org/apache/beam/examples/cookbook/BigQueryTornadoes.java">BigQueryTornadoes
example</a>.
When the example’s read method option is set to <code class="highlighter-rouge">DIRECT_READ</code>, the pipeline uses
the BigQuery Storage API and column projection to read public samples of weather
@@ -763,6 +779,15 @@ GitHub</a>.</p>
</code></pre>
</div>
+<p>The following code snippet reads with a query string.</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="c1">// Snippet not yet available (BEAM-7034).</span>
+</code></pre>
+</div>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="c"># The SDK for Python does not support the BigQuery Storage API.</span>
+</code></pre>
+</div>
+
<h2 id="writing-to-bigquery">Writing to BigQuery</h2>
<p>BigQueryIO allows you to write to BigQuery tables. If you are using the Beam SDK
diff --git a/website/generated-content/documentation/io/built-in/hadoop/index.html b/website/generated-content/documentation/io/built-in/hadoop/index.html
index 023e445..c31f435 100644
--- a/website/generated-content/documentation/io/built-in/hadoop/index.html
+++ b/website/generated-content/documentation/io/built-in/hadoop/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/io/built-in/hcatalog/index.html b/website/generated-content/documentation/io/built-in/hcatalog/index.html
index 2d8ee21..0c02e4c 100644
--- a/website/generated-content/documentation/io/built-in/hcatalog/index.html
+++ b/website/generated-content/documentation/io/built-in/hcatalog/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/io/built-in/index.html b/website/generated-content/documentation/io/built-in/index.html
index a484689..c1ae211 100644
--- a/website/generated-content/documentation/io/built-in/index.html
+++ b/website/generated-content/documentation/io/built-in/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -440,7 +456,6 @@ limitations under the License.
<p><a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/io/vcfio.py">vcfio</a></p>
</td>
<td>
- <p><a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/io/gcp/pubsub.py">Google Cloud Pub/Sub</a></p>
</td>
<td>
<p><a href="/documentation/io/built-in/google-bigquery/">Google BigQuery</a></p>
diff --git a/website/generated-content/documentation/io/developing-io-java/index.html b/website/generated-content/documentation/io/developing-io-java/index.html
index 8c946d8..d0c854d 100644
--- a/website/generated-content/documentation/io/developing-io-java/index.html
+++ b/website/generated-content/documentation/io/developing-io-java/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/io/developing-io-overview/index.html b/website/generated-content/documentation/io/developing-io-overview/index.html
index 89652e8..99c0b95 100644
--- a/website/generated-content/documentation/io/developing-io-overview/index.html
+++ b/website/generated-content/documentation/io/developing-io-overview/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/io/developing-io-python/index.html b/website/generated-content/documentation/io/developing-io-python/index.html
index e9247d6..e5deca9 100644
--- a/website/generated-content/documentation/io/developing-io-python/index.html
+++ b/website/generated-content/documentation/io/developing-io-python/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -622,8 +638,8 @@ a wrapper.</li>
stop_position = self._count
bundle_start = start_position
- while bundle_start < self.stop_position:
- bundle_stop = max(self.stop_position, bundle_start + desired_bundle_size)
+ while bundle_start < stop_position:
+ bundle_stop = max(stop_position, bundle_start + desired_bundle_size)
yield iobase.SourceBundle(weight=(bundle_stop - bundle_start),
source=self,
start_position=bundle_start,
diff --git a/website/generated-content/documentation/io/testing/index.html b/website/generated-content/documentation/io/testing/index.html
index 3573837..333b94b 100644
--- a/website/generated-content/documentation/io/testing/index.html
+++ b/website/generated-content/documentation/io/testing/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/patterns/custom-io-patterns/index.html b/website/generated-content/documentation/patterns/custom-io-patterns/index.html
index d046839..508a3c5 100644
--- a/website/generated-content/documentation/patterns/custom-io-patterns/index.html
+++ b/website/generated-content/documentation/patterns/custom-io-patterns/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/patterns/file-processing-patterns/index.html b/website/generated-content/documentation/patterns/file-processing-patterns/index.html
index 2b4997b..ed4ae9a 100644
--- a/website/generated-content/documentation/patterns/file-processing-patterns/index.html
+++ b/website/generated-content/documentation/patterns/file-processing-patterns/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/patterns/overview/index.html b/website/generated-content/documentation/patterns/overview/index.html
index 291256c..27519c5 100644
--- a/website/generated-content/documentation/patterns/overview/index.html
+++ b/website/generated-content/documentation/patterns/overview/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/patterns/pipeline-option-patterns/index.html b/website/generated-content/documentation/patterns/pipeline-option-patterns/index.html
index 88ecb67..3d27e11 100644
--- a/website/generated-content/documentation/patterns/pipeline-option-patterns/index.html
+++ b/website/generated-content/documentation/patterns/pipeline-option-patterns/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/patterns/side-input-patterns/index.html b/website/generated-content/documentation/patterns/side-input-patterns/index.html
index 36b0782..9538fa0 100644
--- a/website/generated-content/documentation/patterns/side-input-patterns/index.html
+++ b/website/generated-content/documentation/patterns/side-input-patterns/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/pipelines/create-your-pipeline/index.html b/website/generated-content/documentation/pipelines/create-your-pipeline/index.html
index 69ad3e0..d619ffb 100644
--- a/website/generated-content/documentation/pipelines/create-your-pipeline/index.html
+++ b/website/generated-content/documentation/pipelines/create-your-pipeline/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/pipelines/design-your-pipeline/index.html b/website/generated-content/documentation/pipelines/design-your-pipeline/index.html
index 6cc3e79..90c5a4b 100644
--- a/website/generated-content/documentation/pipelines/design-your-pipeline/index.html
+++ b/website/generated-content/documentation/pipelines/design-your-pipeline/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/pipelines/test-your-pipeline/index.html b/website/generated-content/documentation/pipelines/test-your-pipeline/index.html
index c451478..f58820f 100644
--- a/website/generated-content/documentation/pipelines/test-your-pipeline/index.html
+++ b/website/generated-content/documentation/pipelines/test-your-pipeline/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/programming-guide/index.html b/website/generated-content/documentation/programming-guide/index.html
index e72fc92..a3dfe95 100644
--- a/website/generated-content/documentation/programming-guide/index.html
+++ b/website/generated-content/documentation/programming-guide/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -2257,8 +2273,17 @@ are being used, the window is of type <code class="highlighter-rouge">IntervalWi
<span class="o">}})</span>
</code></pre>
</div>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">apache_beam</span> <span class="kn">as</span> <span class="nn">beam</span>
+
+<span class="k">class</span> <span class="nc">ProcessRecord</span><span class="p">(</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="p">):</span>
-<p class="language-java"><strong>PaneInfo:</strong>
+ <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">WindowParam</span><span class="p">):</span>
+ <span class="c"># access window e.g window.end.micros</span>
+ <span class="k">pass</span>
+
+</code></pre>
+</div>
+<p><strong>PaneInfo:</strong>
When triggers are used, Beam provides a <code class="highlighter-rouge">PaneInfo</code> object that contains information about the current firing. Using <code class="highlighter-rouge">PaneInfo</code>
you can determine whether this is an early or a late firing, and how many times this window has already fired for this key.</p>
@@ -2276,12 +2301,68 @@ The <code class="highlighter-rouge">PipelineOptions</code> for the current pipel
</code></pre>
</div>
-<p class="language-java"><code class="highlighter-rouge">@OnTimer</code> methods can also access many of these parameters. Timestamp, window, <code class="highlighter-rouge">PipelineOptions</code>, <code class="highlighter-rouge">OutputReceiver</code>, and
+<p class="language-java"><code class="highlighter-rouge">@OnTimer</code> methods can also access many of these parameters. Timestamp, Window, key, <code class="highlighter-rouge">PipelineOptions</code>, <code class="highlighter-rouge">OutputReceiver</code>, and
<code class="highlighter-rouge">MultiOutputReceiver</code> parameters can all be accessed in an <code class="highlighter-rouge">@OnTimer</code> method. In addition, an <code class="highlighter-rouge">@OnTimer</code> method can take
a parameter of type <code class="highlighter-rouge">TimeDomain</code> which tells whether the timer is based on event time or processing time.
Timers are explained in more detail in the
<a href="/blog/2017/08/28/timely-processing.html">Timely (and Stateful) Processing with Apache Beam</a> blog post.</p>
+<div class="language-py highlighter-rouge"><pre class="highlight"><code>
+<span class="k">class</span> <span class="nc">StatefulDoFn</span><span class="p">(</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="p">):</span>
+ <span class="s">"""An example stateful DoFn with state and timer"""</span>
+
+ <span class="n">BUFFER_STATE_1</span> <span class="o">=</span> <span class="n">BagStateSpec</span><span class="p">(</span><span class="s">'buffer1'</span><span class="p">,</span> <span class="n">beam</span><span class="o">.</span><span class="n">BytesCoder</span><span class="p">())</span>
+ <span class="n">BUFFER_STATE_2</span> <span class="o">=</span> <span class="n">BagStateSpec</span><span class="p">(</span><span class="s">'buffer2'</span><span class="p">,</span> <span class="n">beam</span><span class="o">.</span><span class="n">VarIntCoder</span><span class="p">())</span>
+ <span class="n">WATERMARK_TIMER</span> <span class="o">=</span> <span class="n">TimerSpec</span><span class="p">(</span><span class="s">'watermark_timer'</span><span class="p">,</span> <span class="n">TimeDomain</span><span class="o">.</span><span class="n">WATERMARK</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
+ <span class="n">element</span><span class="p">,</span>
+ <span class="n">timestamp</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">TimestampParam</span><span class="p">,</span>
+ <span class="n">window</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">WindowParam</span><span class="p">,</span>
+ <span class="n">buffer_1</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">StateParam</span><span class="p">(</span><span class="n">BUFFER_STATE_1</span><span class="p">),</span>
+ <span class="n">buffer_2</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">StateParam</span><span class="p">(</span><span class="n">BUFFER_STATE_2</span><span class="p">),</span>
+ <span class="n">watermark_timer</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">TimerParam</span><span class="p">(</span><span class="n">WATERMARK_TIMER</span><span class="p">)):</span>
+
+ <span class="c"># Do you processing here</span>
+ <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">element</span>
+ <span class="c"># Read all the data from buffer1</span>
+ <span class="n">all_values_in_buffer_1</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">buffer_1</span><span class="o">.</span><span class="n">read</span><span class="p">()]</span>
+
+ <span class="k">if</span> <span class="n">StatefulDoFn</span><span class="o">.</span><span class="n">_is_clear_buffer_1_required</span><span class="p">(</span><span class="n">all_values_in_buffer_1</span><span class="p">):</span>
+ <span class="c"># clear the buffer data if required conditions are met.</span>
+ <span class="n">buffer_1</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+
+ <span class="c"># add the value to buffer 2</span>
+ <span class="n">buffer_2</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">StatefulDoFn</span><span class="o">.</span><span class="n">_all_condition_met</span><span class="p">():</span>
+ <span class="c"># Clear the timer if certain condition met and you don't want to trigger</span>
+ <span class="c"># the callback method.</span>
+ <span class="n">watermark_timer</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+
+ <span class="k">yield</span> <span class="n">element</span>
+
+ <span class="nd">@on_timer</span><span class="p">(</span><span class="n">WATERMARK_TIMER</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">on_expiry_1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
+ <span class="n">timestamp</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">TimestampParam</span><span class="p">,</span>
+ <span class="n">window</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">WindowParam</span><span class="p">,</span>
+ <span class="n">key</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">KeyParam</span><span class="p">,</span>
+ <span class="n">buffer_1</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">StateParam</span><span class="p">(</span><span class="n">BUFFER_STATE_1</span><span class="p">),</span>
+ <span class="n">buffer_2</span><span class="o">=</span><span class="n">beam</span><span class="o">.</span><span class="n">DoFn</span><span class="o">.</span><span class="n">StateParam</span><span class="p">(</span><span class="n">BUFFER_STATE_2</span><span class="p">)):</span>
+ <span class="c"># Window and key parameters are really useful especially for debugging issues.</span>
+ <span class="k">yield</span> <span class="s">'expired1'</span>
+
+ <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">_all_condition_met</span><span class="p">():</span>
+ <span class="c"># some logic</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">_is_clear_buffer_1_required</span><span class="p">(</span><span class="n">buffer_1_data</span><span class="p">):</span>
+ <span class="c"># Some business logic</span>
+ <span class="k">return</span> <span class="bp">True</span>
+</code></pre>
+</div>
<h3 id="composite-transforms">4.6. Composite transforms</h3>
<p>Transforms can have a nested structure, where a complex transform performs
diff --git a/website/generated-content/documentation/resources/learning-resources/index.html b/website/generated-content/documentation/resources/learning-resources/index.html
index d6b1f6b..0ce50bb 100644
--- a/website/generated-content/documentation/resources/learning-resources/index.html
+++ b/website/generated-content/documentation/resources/learning-resources/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/resources/videos-and-podcasts/index.html b/website/generated-content/documentation/resources/videos-and-podcasts/index.html
index 674b6c5..0b21dc1 100644
--- a/website/generated-content/documentation/resources/videos-and-podcasts/index.html
+++ b/website/generated-content/documentation/resources/videos-and-podcasts/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/apex/index.html b/website/generated-content/documentation/runners/apex/index.html
index dbd0fb7..20a9e50 100644
--- a/website/generated-content/documentation/runners/apex/index.html
+++ b/website/generated-content/documentation/runners/apex/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/capability-matrix/index.html b/website/generated-content/documentation/runners/capability-matrix/index.html
index 3525962..f4affdf 100644
--- a/website/generated-content/documentation/runners/capability-matrix/index.html
+++ b/website/generated-content/documentation/runners/capability-matrix/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/dataflow/index.html b/website/generated-content/documentation/runners/dataflow/index.html
index 08d2877..83b25b8 100644
--- a/website/generated-content/documentation/runners/dataflow/index.html
+++ b/website/generated-content/documentation/runners/dataflow/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/direct/index.html b/website/generated-content/documentation/runners/direct/index.html
index 9c1f233..86788d3 100644
--- a/website/generated-content/documentation/runners/direct/index.html
+++ b/website/generated-content/documentation/runners/direct/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/flink/index.html b/website/generated-content/documentation/runners/flink/index.html
index 7754b82..fc7eb8d 100644
--- a/website/generated-content/documentation/runners/flink/index.html
+++ b/website/generated-content/documentation/runners/flink/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/gearpump/index.html b/website/generated-content/documentation/runners/gearpump/index.html
index 7d5b8dd..dead29b 100644
--- a/website/generated-content/documentation/runners/gearpump/index.html
+++ b/website/generated-content/documentation/runners/gearpump/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/jet/index.html b/website/generated-content/documentation/runners/jet/index.html
index f30ac07..7832dfc 100644
--- a/website/generated-content/documentation/runners/jet/index.html
+++ b/website/generated-content/documentation/runners/jet/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/jstorm/index.html b/website/generated-content/documentation/runners/jstorm/index.html
index f3fcd45..f39838b 100644
--- a/website/generated-content/documentation/runners/jstorm/index.html
+++ b/website/generated-content/documentation/runners/jstorm/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/mapreduce/index.html b/website/generated-content/documentation/runners/mapreduce/index.html
index 05c3d6b..8f32da1 100644
--- a/website/generated-content/documentation/runners/mapreduce/index.html
+++ b/website/generated-content/documentation/runners/mapreduce/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/nemo/index.html b/website/generated-content/documentation/runners/nemo/index.html
index db87ce9..f5c3127 100644
--- a/website/generated-content/documentation/runners/nemo/index.html
+++ b/website/generated-content/documentation/runners/nemo/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/samza/index.html b/website/generated-content/documentation/runners/samza/index.html
index 53b66d7..d206611 100644
--- a/website/generated-content/documentation/runners/samza/index.html
+++ b/website/generated-content/documentation/runners/samza/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/runners/spark/index.html b/website/generated-content/documentation/runners/spark/index.html
index ea63b46..18a553e 100644
--- a/website/generated-content/documentation/runners/spark/index.html
+++ b/website/generated-content/documentation/runners/spark/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -182,6 +198,7 @@
<ul class="nav">
+ <li><a href="#portability">Portability</a></li>
<li><a href="#spark-runner-prerequisites-and-setup">Spark Runner prerequisites and setup</a>
<ul>
<li><a href="#deploying-spark-with-your-application">Deploying Spark with your application</a></li>
@@ -235,11 +252,43 @@ The Spark Runner can execute Spark pipelines just like a native Spark applicatio
<p><em><strong>Note:</strong></em> <em>support for the Beam Model in streaming is currently experimental, follow-up in the <a href="/get-started/support/">mailing list</a> for status updates.</em></p>
+<h2 id="portability">Portability</h2>
+
+<p>The Spark runner comes in two flavors:</p>
+
+<ol>
+ <li>A <em>legacy Runner</em> which supports only Java (and other JVM-based languages)</li>
+ <li>A <em>portable Runner</em> which supports Java, Python, and Go</li>
+</ol>
+
+<p>Beam and its Runners originally only supported JVM-based languages
+(e.g. Java/Scala/Kotlin). Python and Go SDKs were added later on. The
+architecture of the Runners had to be changed significantly to support executing
+pipelines written in other languages.</p>
+
+<p>If your applications only use Java, then you should currently go with the legacy
+Runner. If you want to run Python or Go pipelines with Beam on Spark, you need to use
+the portable Runner. For more information on portability, please visit the
+<a href="/roadmap/portability/">Portability page</a>.</p>
+
+<p>This guide is split into two parts to document the legacy and
+the portable functionality of the Spark Runner. Please use the switcher below to
+select the appropriate Runner:</p>
+
+<nav class="language-switcher">
+ <strong>Adapt for:</strong>
+ <ul>
+ <li data-type="language-java">Legacy (Java)</li>
+ <li data-type="language-py">Portable (Java/Python/Go)</li>
+ </ul>
+</nav>
+
<h2 id="spark-runner-prerequisites-and-setup">Spark Runner prerequisites and setup</h2>
<p>The Spark runner currently supports Spark’s 2.x branch, and more specifically any version greater than 2.2.0.</p>
-<p>You can add a dependency on the latest version of the Spark runner by adding to your pom.xml the following:</p>
+<p><span class="language-java">You can add a dependency on the latest version of the Spark runner by adding to your pom.xml the following:</span></p>
+
<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="o"><</span><span class="n">dependency</span><span class="o">></span>
<span class="o"><</span><span class="n">groupId</span><span class="o">></span><span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">beam</span><span class="o"></</span><span class="n">groupId</span><span class="o">></span>
<span class="o"><</span><span class="n">artifactId</span><span class="o">></span><span class="n">beam</span><span class="o">-</span><span class="n">runners</span><span class="o">-</span><span class="n">spark</span><span class="o"></</span><span class="n">artifactId</span><span class="o">></span>
@@ -250,7 +299,8 @@ The Spark Runner can execute Spark pipelines just like a native Spark applicatio
<h3 id="deploying-spark-with-your-application">Deploying Spark with your application</h3>
-<p>In some cases, such as running in local mode/Standalone, your (self-contained) application would be required to pack Spark by explicitly adding the following dependencies in your pom.xml:</p>
+<p><span class="language-java">In some cases, such as running in local mode/Standalone, your (self-contained) application would be required to pack Spark by explicitly adding the following dependencies in your pom.xml:</span></p>
+
<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="o"><</span><span class="n">dependency</span><span class="o">></span>
<span class="o"><</span><span class="n">groupId</span><span class="o">></span><span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">spark</span><span class="o"></</span><span class="n">groupId</span><span class="o">></span>
<span class="o"><</span><span class="n">artifactId</span><span class="o">></span><span class="n">spark</span><span class="o">-</span><span class="n">core_2</span><span class="o">.</span><span class="mi">10</span><span class="o"></</span><span class="n">artifactId</span><span class="o">></span>
@@ -265,7 +315,8 @@ The Spark Runner can execute Spark pipelines just like a native Spark applicatio
</code></pre>
</div>
-<p>And shading the application jar using the maven shade plugin:</p>
+<p><span class="language-java">And shading the application jar using the maven shade plugin:</span></p>
+
<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="o"><</span><span class="n">plugin</span><span class="o">></span>
<span class="o"><</span><span class="n">groupId</span><span class="o">></span><span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">maven</span><span class="o">.</span><span class="na">plugins</span><span class="o"></</span><span class="n">groupId</span><span class="o">></span>
<span class="o"><</span><span class="n">artifactId</span><span class="o">></span><span class="n">maven</span><span class="o">-</span><span class="n">shade</span><span class="o">-</span><span class="n">plugin</span><span class="o"></</span><span class="n">artifactId</span><span class="o">></span>
@@ -302,13 +353,58 @@ The Spark Runner can execute Spark pipelines just like a native Spark applicatio
</code></pre>
</div>
-<p>After running <code>mvn package</code>, run <code>ls target</code> and you should see (assuming your artifactId is <code class="highlighter-rouge">beam-examples</code> and the version is <code class="highlighter-rouge">1.0.0</code>):</p>
-<div class="highlighter-rouge"><pre class="highlight"><code>beam-examples-1.0.0-shaded.jar
+<p><span class="language-java">After running <code>mvn package</code>, run <code>ls target</code> and you should see (assuming your artifactId is <code class="highlighter-rouge">beam-examples</code> and the version is <code class="highlighter-rouge">1.0.0</code>):</span></p>
+
+<p><code class="language-java">
+beam-examples-1.0.0-shaded.jar
+</code></p>
+
+<p><span class="language-java">To run against a Standalone cluster simply run:</span></p>
+
+<p><code class="language-java">
+spark-submit --class com.beam.examples.BeamPipeline --master spark://HOST:PORT target/beam-examples-1.0.0-shaded.jar --runner=SparkRunner
+</code></p>
+
+<p><span class="language-py">
+You will need Docker to be installed in your execution environment. To develop
+Apache Beam with Python you have to install the Apache Beam Python SDK: <code class="highlighter-rouge">pip
+install apache_beam</code>. Please refer to the <a href="/documentation/sdks/python/">Python documentation</a>
+on how to create a Python pipeline.
+</span></p>
+
+<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="n">pip</span> <span class="n">install</span> <span class="n">apache_beam</span>
</code></pre>
</div>
-<p>To run against a Standalone cluster simply run:</p>
-<div class="highlighter-rouge"><pre class="highlight"><code>spark-submit --class com.beam.examples.BeamPipeline --master spark://HOST:PORT target/beam-examples-1.0.0-shaded.jar --runner=SparkRunner
+<p><span class="language-py">
+As of now you will need a copy of Apache Beam’s source code. You can
+download it on the <a href="/get-started/downloads/">Downloads page</a>. In the future there will be pre-built Docker images
+available.
+</span></p>
+
+<p><span class="language-py">1. <em>Only required once:</em> Build the SDK harness container: <code class="highlighter-rouge">./gradlew :sdks:python:container:docker</code>
+</span></p>
+
+<p><span class="language-py">2. Start the JobService endpoint: <code class="highlighter-rouge">./gradlew :runners:spark:job-server:runShadow</code>
+</span></p>
+
+<p><span class="language-py">
+The JobService is the central instance where you submit your Beam pipeline.
+The JobService will create a Spark job for the pipeline and execute the
+job. To execute the job on a Spark cluster, the Beam JobService needs to be
+provided with the Spark master address.
+</span></p>
+
+<p><span class="language-py">3. Submit the Python pipeline to the above endpoint by using the <code class="highlighter-rouge">PortableRunner</code> and <code class="highlighter-rouge">job_endpoint</code> set to <code class="highlighter-rouge">localhost:8099</code> (this is the default address of the JobService). For example:
+</span></p>
+
+<div class="language-py highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">apache_beam</span> <span class="kn">as</span> <span class="nn">beam</span>
+<span class="kn">from</span> <span class="nn">apache_beam.options.pipeline_options</span> <span class="kn">import</span> <span class="n">PipelineOptions</span>
+
+<span class="n">options</span> <span class="o">=</span> <span class="n">PipelineOptions</span><span class="p">([</span><span class="s">"--runner=PortableRunner"</span><span class="p">,</span> <span class="s">"--job_endpoint=localhost:8099"</span><span class="p">])</span>
+<span class="n">p</span> <span class="o">=</span> <span class="n">beam</span><span class="o">.</span><span class="n">Pipeline</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
+<span class="o">..</span>
+<span class="n">p</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</code></pre>
</div>
@@ -317,11 +413,20 @@ The Spark Runner can execute Spark pipelines just like a native Spark applicatio
<p>Deploying your Beam pipeline on a cluster that already has a Spark deployment (Spark classes are available in container classpath) does not require any additional dependencies.
For more details on the different deployment modes see: <a href="http://spark.apache.org/docs/latest/spark-standalone.html">Standalone</a>, <a href="http://spark.apache.org/docs/latest/running-on-yarn.html">YARN</a>, or <a href="http://spark.apache.org/docs/latest/running-on-mesos.html">Mesos</a>.</p>
+<p><span class="language-py">1. Start a Spark cluster which exposes the master on port 7077 by default.
+</span></p>
+
+<p><span class="language-py">2. Start JobService that will connect with the Spark master: <code class="highlighter-rouge">./gradlew :runners:spark:job-server:runShadow -PsparkMasterUrl=spark://localhost:7077</code>.
+</span></p>
+
+<p><span class="language-py">3. Submit the pipeline as above.
+</span></p>
+
<h2 id="pipeline-options-for-the-spark-runner">Pipeline options for the Spark Runner</h2>
<p>When executing your pipeline with the Spark Runner, you should consider the following pipeline options.</p>
-<table class="table table-bordered">
+<table class="language-java table table-bordered">
<tr>
<th>Field</th>
<th>Description</th>
@@ -359,6 +464,24 @@ For more details on the different deployment modes see: <a href="http://spark.ap
</tr>
</table>
+<table class="language-py table table-bordered">
+<tr>
+ <th>Field</th>
+ <th>Description</th>
+ <th>Value</th>
+</tr>
+<tr>
+ <td><code>--runner</code></td>
+ <td>The pipeline runner to use. This option allows you to determine the pipeline runner at runtime.</td>
+ <td>Set to <code>PortableRunner</code> to run using Spark.</td>
+</tr>
+<tr>
+ <td><code>--job_endpoint</code></td>
+ <td>Job service endpoint to use. Should be in the form hostname:port, e.g. localhost:3000</td>
+ <td>Set to match your job service endpoint (localhost:8099 by default)</td>
+</tr>
+</table>
+
<h2 id="additional-notes">Additional notes</h2>
<h3 id="using-spark-submit">Using spark-submit</h3>
@@ -372,17 +495,26 @@ For more on how to generally use <code>spark-submit</code> checkout Spark <a hre
<p>You can monitor a running Spark job using the Spark <a href="http://spark.apache.org/docs/latest/monitoring.html#web-interfaces">Web Interfaces</a>. By default, this is available at port <code class="highlighter-rouge">4040</code> on the driver node. If you run Spark on your local machine that would be <code class="highlighter-rouge">http://localhost:4040</code>.
Spark also has a history server to <a href="http://spark.apache.org/docs/latest/monitoring.html#viewing-after-the-fact">view after the fact</a>.
+<span class="language-java">
Metrics are also available via <a href="http://spark.apache.org/docs/latest/monitoring.html#rest-api">REST API</a>.
-Spark provides a <a href="http://spark.apache.org/docs/latest/monitoring.html#metrics">metrics system</a> that allows reporting Spark metrics to a variety of Sinks. The Spark runner reports user-defined Beam Aggregators using this same metrics system and currently supports <code>GraphiteSink</code> and <code>CSVSink</code>, and providing support for additional Sinks supported by Spark is easy and straight-forward.</p>
+Spark provides a <a href="http://spark.apache.org/docs/latest/monitoring.html#metrics">metrics system</a> that allows reporting Spark metrics to a variety of Sinks. The Spark runner reports user-defined Beam Aggregators using this same metrics system and currently supports <code>GraphiteSink</code> and <code>CSVSink</code>, and providing support for additional Sinks supported by Spark is easy and straight-forward.
+</span>
+<span class="language-py">Spark metrics are not yet supported on the portable runner.</span></p>
<h3 id="streaming-execution">Streaming Execution</h3>
-<p>If your pipeline uses an <code>UnboundedSource</code> the Spark Runner will automatically set streaming mode. Forcing streaming mode is mostly used for testing and is not recommended.</p>
+<p><span class="language-java">
+If your pipeline uses an <code>UnboundedSource</code> the Spark Runner will automatically set streaming mode. Forcing streaming mode is mostly used for testing and is not recommended.
+</span>
+<span class="language-py">Streaming is not yet supported on the Spark portable runner.</span></p>
<h3 id="using-a-provided-sparkcontext-and-streaminglisteners">Using a provided SparkContext and StreamingListeners</h3>
-<p>If you would like to execute your Spark job with a provided <code>SparkContext</code>, such as when using the <a href="https://github.com/spark-jobserver/spark-jobserver">spark-jobserver</a>, or use <code>StreamingListeners</code>, you can’t use <code>SparkPipelineOptions</code> (the context or a listener cannot be passed as a command-line argument anyway).
-Instead, you should use <code>SparkContextOptions</code> which can only be used programmatically and is not a common <code>PipelineOptions</code> implementation.</p>
+<p><span class="language-java">
+If you would like to execute your Spark job with a provided <code>SparkContext</code>, such as when using the <a href="https://github.com/spark-jobserver/spark-jobserver">spark-jobserver</a>, or use <code>StreamingListeners</code>, you can’t use <code>SparkPipelineOptions</code> (the context or a listener cannot be passed as a command-line argument anyway).
+Instead, you should use <code>SparkContextOptions</code> which can only be used programmatically and is not a common <code>PipelineOptions</code> implementation.
+</span>
+<span class="language-py">Provided SparkContext and StreamingListeners are not supported on the Spark portable runner.</span></p>
</div>
</div>
diff --git a/website/generated-content/documentation/sdks/feature-comparison/index.html b/website/generated-content/documentation/sdks/feature-comparison/index.html
index 6871535..fed6c34 100644
--- a/website/generated-content/documentation/sdks/feature-comparison/index.html
+++ b/website/generated-content/documentation/sdks/feature-comparison/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/go/index.html b/website/generated-content/documentation/sdks/go/index.html
index 547a3b3..a2a5336 100644
--- a/website/generated-content/documentation/sdks/go/index.html
+++ b/website/generated-content/documentation/sdks/go/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/java-dependencies/index.html b/website/generated-content/documentation/sdks/java-dependencies/index.html
index 842fe80..3cd04f7 100644
--- a/website/generated-content/documentation/sdks/java-dependencies/index.html
+++ b/website/generated-content/documentation/sdks/java-dependencies/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/java-extensions/index.html b/website/generated-content/documentation/sdks/java-extensions/index.html
index 45eeba7..527b441 100644
--- a/website/generated-content/documentation/sdks/java-extensions/index.html
+++ b/website/generated-content/documentation/sdks/java-extensions/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/java-thirdparty/index.html b/website/generated-content/documentation/sdks/java-thirdparty/index.html
index fd64fcf..a6a55b9 100644
--- a/website/generated-content/documentation/sdks/java-thirdparty/index.html
+++ b/website/generated-content/documentation/sdks/java-thirdparty/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/java/euphoria/index.html b/website/generated-content/documentation/sdks/java/euphoria/index.html
index 10aa575..44c21ad 100644
--- a/website/generated-content/documentation/sdks/java/euphoria/index.html
+++ b/website/generated-content/documentation/sdks/java/euphoria/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/java/index.html b/website/generated-content/documentation/sdks/java/index.html
index ad0dbe7..fcc25e8 100644
--- a/website/generated-content/documentation/sdks/java/index.html
+++ b/website/generated-content/documentation/sdks/java/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/java/testing/nexmark/index.html b/website/generated-content/documentation/sdks/java/testing/nexmark/index.html
index ff95c59..e81e462 100644
--- a/website/generated-content/documentation/sdks/java/testing/nexmark/index.html
+++ b/website/generated-content/documentation/sdks/java/testing/nexmark/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/python-dependencies/index.html b/website/generated-content/documentation/sdks/python-dependencies/index.html
index fd4812b..c18d082 100644
--- a/website/generated-content/documentation/sdks/python-dependencies/index.html
+++ b/website/generated-content/documentation/sdks/python-dependencies/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -274,6 +290,45 @@ the listed versions that will be in scope during execution.</p>
<p>To see the compile and runtime dependencies for your Beam SDK version, expand
the relevant section below.</p>
+<details><summary><b>2.13.0</b></summary>
+
+<p>Beam SDK for Python 2.13.0 has the following compile and
+ runtime dependencies.</p>
+
+<table class="table-bordered table-striped">
+ <tr><th>Package</th><th>Version</th></tr>
+ <tr><td>avro-python3</td><td>>=1.8.1,<2.0.0; python_version >= "3.0"</td></tr>
+ <tr><td>avro</td><td>>=1.8.1,<2.0.0; python_version < "3.0"</td></tr>
+ <tr><td>cachetools</td><td>>=3.1.0,<4</td></tr>
+ <tr><td>crcmod</td><td>>=1.7,<2.0</td></tr>
+ <tr><td>dill</td><td>>=0.2.9,<0.2.10</td></tr>
+ <tr><td>fastavro</td><td>>=0.21.4,<0.22</td></tr>
+ <tr><td>future</td><td>>=0.16.0,<1.0.0</td></tr>
+ <tr><td>futures</td><td>>=3.2.0,<4.0.0; python_version < "3.0"</td></tr>
+ <tr><td>google-apitools</td><td>>=0.5.28,<0.5.29</td></tr>
+ <tr><td>google-cloud-bigquery</td><td>>=1.6.0,<1.7.0</td></tr>
+ <tr><td>google-cloud-bigtable</td><td>>=0.31.1,<0.33.0</td></tr>
+ <tr><td>google-cloud-core</td><td>>=0.28.1,<0.30.0</td></tr>
+ <tr><td>google-cloud-datastore</td><td>>=1.7.1,<1.8.0</td></tr>
+ <tr><td>google-cloud-pubsub</td><td>>=0.39.0,<0.40.0</td></tr>
+ <tr><td>googledatastore</td><td>>=7.0.1,<7.1; python_version < "3.0"</td></tr>
+ <tr><td>grpcio</td><td>>=1.8,<2</td></tr>
+ <tr><td>hdfs</td><td>>=2.1.0,<3.0.0</td></tr>
+ <tr><td>httplib2</td><td>>=0.8,<=0.12.0</td></tr>
+ <tr><td>mock</td><td>>=1.0.1,<3.0.0</td></tr>
+ <tr><td>oauth2client</td><td>>=2.0.1,<4</td></tr>
+ <tr><td>proto-google-cloud-datastore-v1</td><td>>=0.90.0,<=0.90.4; python_version < "3.0"</td></tr>
+ <tr><td>protobuf</td><td>>=3.5.0.post1,<4</td></tr>
+ <tr><td>pyarrow</td><td>>=0.11.1,<0.14.0; python_version >= "3.0" or platform_system != "Windows"</td></tr>
+ <tr><td>pydot</td><td>>=1.2.0,<1.3</td></tr>
+ <tr><td>pytz</td><td>>=2018.3</td></tr>
+ <tr><td>pyvcf</td><td>>=0.6.8,<0.7.0; python_version < "3.0"</td></tr>
+ <tr><td>pyyaml</td><td>>=3.12,<4.0.0</td></tr>
+ <tr><td>typing</td><td>>=3.6.0,<3.7.0; python_version < "3.5.0"</td></tr>
+</table>
+
+</details>
+
<details><summary><b>2.12.0</b></summary>
<p>Beam SDK for Python 2.12.0 has the following compile and
diff --git a/website/generated-content/documentation/sdks/python-pipeline-dependencies/index.html b/website/generated-content/documentation/sdks/python-pipeline-dependencies/index.html
index 8e0920a..6b17dc0 100644
--- a/website/generated-content/documentation/sdks/python-pipeline-dependencies/index.html
+++ b/website/generated-content/documentation/sdks/python-pipeline-dependencies/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/python-streaming/index.html b/website/generated-content/documentation/sdks/python-streaming/index.html
index 0a96d90..b9fcca0 100644
--- a/website/generated-content/documentation/sdks/python-streaming/index.html
+++ b/website/generated-content/documentation/sdks/python-streaming/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/python-type-safety/index.html b/website/generated-content/documentation/sdks/python-type-safety/index.html
index d9f3a58..1017df3 100644
--- a/website/generated-content/documentation/sdks/python-type-safety/index.html
+++ b/website/generated-content/documentation/sdks/python-type-safety/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/sdks/python/index.html b/website/generated-content/documentation/sdks/python/index.html
index 4f250fc..4d5accf 100644
--- a/website/generated-content/documentation/sdks/python/index.html
+++ b/website/generated-content/documentation/sdks/python/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/approximatequantiles/index.html b/website/generated-content/documentation/transforms/python/aggregation/approximatequantiles/index.html
index c8fedc6..b110b1f 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/approximatequantiles/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/approximatequantiles/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/approximateunique/index.html b/website/generated-content/documentation/transforms/python/aggregation/approximateunique/index.html
index e9dec2b..6436d0c 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/approximateunique/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/approximateunique/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/cogroupbykey/index.html b/website/generated-content/documentation/transforms/python/aggregation/cogroupbykey/index.html
index cad2d58..00ecf4b 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/cogroupbykey/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/cogroupbykey/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/combineglobally/index.html b/website/generated-content/documentation/transforms/python/aggregation/combineglobally/index.html
index 0542647..d652c37 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/combineglobally/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/combineglobally/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/combinewithcontext/index.html b/website/generated-content/documentation/transforms/python/aggregation/combinewithcontext/index.html
index 3e52c89..2f6e740 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/combinewithcontext/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/combinewithcontext/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/count/index.html b/website/generated-content/documentation/transforms/python/aggregation/count/index.html
index c4f9079..c312be6 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/count/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/count/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/distinct/index.html b/website/generated-content/documentation/transforms/python/aggregation/distinct/index.html
index 82f5780..e3c0d59 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/distinct/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/distinct/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/groupbykey/index.html b/website/generated-content/documentation/transforms/python/aggregation/groupbykey/index.html
index 4d1df83..520d04a 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/groupbykey/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/groupbykey/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/groupintobatches/index.html b/website/generated-content/documentation/transforms/python/aggregation/groupintobatches/index.html
index 1239ebe..89dd5da 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/groupintobatches/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/groupintobatches/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/latest/index.html b/website/generated-content/documentation/transforms/python/aggregation/latest/index.html
index f2e1f02..1df4137 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/latest/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/latest/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/max/index.html b/website/generated-content/documentation/transforms/python/aggregation/max/index.html
index 4269a1e..7cc66a7 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/max/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/max/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/mean/index.html b/website/generated-content/documentation/transforms/python/aggregation/mean/index.html
index 570412b..d6969b3 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/mean/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/mean/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/min/index.html b/website/generated-content/documentation/transforms/python/aggregation/min/index.html
index 4b83d96..e1477ec 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/min/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/min/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/sample/index.html b/website/generated-content/documentation/transforms/python/aggregation/sample/index.html
index 00d9416..5fbba2a 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/sample/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/sample/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/sum/index.html b/website/generated-content/documentation/transforms/python/aggregation/sum/index.html
index 0bcbc59..2650898 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/sum/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/sum/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/aggregation/top/index.html b/website/generated-content/documentation/transforms/python/aggregation/top/index.html
index 619ed8a..480547f 100644
--- a/website/generated-content/documentation/transforms/python/aggregation/top/index.html
+++ b/website/generated-content/documentation/transforms/python/aggregation/top/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/filter/index.html b/website/generated-content/documentation/transforms/python/elementwise/filter/index.html
index c3f9918..06dad38 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/filter/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/filter/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/flatmap/index.html b/website/generated-content/documentation/transforms/python/elementwise/flatmap/index.html
index 4d6fb64..b687763 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/flatmap/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/flatmap/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/keys/index.html b/website/generated-content/documentation/transforms/python/elementwise/keys/index.html
index c4b7706..190c12a 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/keys/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/keys/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/kvswap/index.html b/website/generated-content/documentation/transforms/python/elementwise/kvswap/index.html
index 885f3d1..656beeb 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/kvswap/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/kvswap/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/map/index.html b/website/generated-content/documentation/transforms/python/elementwise/map/index.html
index e2856a6..a215dee 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/map/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/map/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/pardo/index.html b/website/generated-content/documentation/transforms/python/elementwise/pardo/index.html
index 7e71e47..2633670 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/pardo/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/pardo/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/partition/index.html b/website/generated-content/documentation/transforms/python/elementwise/partition/index.html
index 5c7f72d..d8fcb0c 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/partition/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/partition/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/regex/index.html b/website/generated-content/documentation/transforms/python/elementwise/regex/index.html
index d6d4a345..9926edd 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/regex/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/regex/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/reify/index.html b/website/generated-content/documentation/transforms/python/elementwise/reify/index.html
index aac27e7..11b9dfb 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/reify/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/reify/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/tostring/index.html b/website/generated-content/documentation/transforms/python/elementwise/tostring/index.html
index f267e60..04d69e3 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/tostring/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/tostring/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/values/index.html b/website/generated-content/documentation/transforms/python/elementwise/values/index.html
index 9a90b24..25e0c43 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/values/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/values/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/withkeys/index.html b/website/generated-content/documentation/transforms/python/elementwise/withkeys/index.html
index 4b958c4..6433d96 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/withkeys/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/withkeys/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/elementwise/withtimestamps/index.html b/website/generated-content/documentation/transforms/python/elementwise/withtimestamps/index.html
index 6f3a51f..504eace 100644
--- a/website/generated-content/documentation/transforms/python/elementwise/withtimestamps/index.html
+++ b/website/generated-content/documentation/transforms/python/elementwise/withtimestamps/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/other/create/index.html b/website/generated-content/documentation/transforms/python/other/create/index.html
index 8373334..a0b40c3 100644
--- a/website/generated-content/documentation/transforms/python/other/create/index.html
+++ b/website/generated-content/documentation/transforms/python/other/create/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/other/flatten/index.html b/website/generated-content/documentation/transforms/python/other/flatten/index.html
index febd212..29a7f0f 100644
--- a/website/generated-content/documentation/transforms/python/other/flatten/index.html
+++ b/website/generated-content/documentation/transforms/python/other/flatten/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/other/passert/index.html b/website/generated-content/documentation/transforms/python/other/passert/index.html
index 2165aaa..251838e 100644
--- a/website/generated-content/documentation/transforms/python/other/passert/index.html
+++ b/website/generated-content/documentation/transforms/python/other/passert/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/other/reshuffle/index.html b/website/generated-content/documentation/transforms/python/other/reshuffle/index.html
index aa99829..085b254 100644
--- a/website/generated-content/documentation/transforms/python/other/reshuffle/index.html
+++ b/website/generated-content/documentation/transforms/python/other/reshuffle/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/other/view/index.html b/website/generated-content/documentation/transforms/python/other/view/index.html
index 579f8b4..6c7f307 100644
--- a/website/generated-content/documentation/transforms/python/other/view/index.html
+++ b/website/generated-content/documentation/transforms/python/other/view/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/other/windowinto/index.html b/website/generated-content/documentation/transforms/python/other/windowinto/index.html
index 69423da..5de4969 100644
--- a/website/generated-content/documentation/transforms/python/other/windowinto/index.html
+++ b/website/generated-content/documentation/transforms/python/other/windowinto/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/documentation/transforms/python/overview/index.html b/website/generated-content/documentation/transforms/python/overview/index.html
index db6329c..1dc22b8 100644
--- a/website/generated-content/documentation/transforms/python/overview/index.html
+++ b/website/generated-content/documentation/transforms/python/overview/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/feed.xml b/website/generated-content/feed.xml
index 5d50757..704943b 100644
--- a/website/generated-content/feed.xml
+++ b/website/generated-content/feed.xml
@@ -20,6 +20,440 @@
<generator>Jekyll v3.2.0</generator>
<item>
+ <title>Looping timers in Apache Beam</title>
+ <description><!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<p>Apache Beam’s primitives let you build expressive data pipelines, suitable for a
+variety of use cases. One specific use case is the analysis of time series data
+in which continuous sequences across window boundaries are important. A few fun
+challenges arise as you tackle this type of data and in this blog we will
+explore one of those in more detail and make use of the Timer API
+(<a href="/blog/2017/08/28/timely-processing.html">blog post</a>)
+using the “looping timer” pattern.</p>
+
+<!--more-->
+
+<p>With Beam in streaming mode, you can take streams of data and build analytical
+transforms to produce results on the data. But for time series data, the absence
+of data is useful information. So how can we produce results in the absence of
+data?</p>
+
+<p>Let’s use a more concrete example to illustrate the requirement. Imagine you
+have a simple pipeline that sums the number of events coming from an IoT device
+every minute. We would like to produce the value 0 when no data has been seen
+within a specific time interval. So why can this get tricky? Well it is easy to
+build a simple pipeline that counts events as they arrive, but when there is no
+event, there is nothing to count!</p>
+
+<p>Let’s build a simple pipeline to work with:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> // We will start our timer at 1 sec from the fixed upper boundary of our
+ // minute window
+ Instant now = Instant.parse("2000-01-01T00:00:59Z");
+
+ // ----- Create some dummy data
+
+ // Create 3 elements, incrementing by 1 minute and leaving a time gap between
+ // element 2 and element 3
+ TimestampedValue&lt;KV&lt;String, Integer&gt;&gt; time_1 =
+ TimestampedValue.of(KV.of("Key_A", 1), now);
+
+ TimestampedValue&lt;KV&lt;String, Integer&gt;&gt; time_2 =
+ TimestampedValue.of(KV.of("Key_A", 2),
+ now.plus(Duration.standardMinutes(1)));
+
+ // No Value for start time + 2 mins
+ TimestampedValue&lt;KV&lt;String, Integer&gt;&gt; time_3 =
+ TimestampedValue.of(KV.of("Key_A", 3),
+ now.plus(Duration.standardMinutes(3)));
+
+ // Create pipeline
+ PipelineOptions options = PipelineOptionsFactory.fromArgs(args).withValidation()
+ .as(PipelineOptions.class);
+
+ Pipeline p = Pipeline.create(options);
+
+ // Apply a fixed window of duration 1 min and Sum the results
+ p.apply(Create.timestamped(time_1, time_2, time_3))
+ .apply(
+ Window.&lt;KV&lt;String,Integer&gt;&gt;into(
+FixedWindows.&lt;Integer&gt;of(Duration.standardMinutes(1))))
+ .apply(Sum.integersPerKey())
+ .apply(ParDo.of(new DoFn&lt;KV&lt;String, Integer&gt;, KV&lt;String, Integer&gt;&gt;() {
+
+ @ProcessElement public void process(ProcessContext c) {
+ LOG.info("Value is {} timestamp is {}", c.element(), c.timestamp());
+ }
+ }));
+
+ p.run();
+</code></pre>
+</div>
+
+<p>Running that pipeline will result in the following output:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>INFO LoopingTimer - Value is KV{Key_A, 1} timestamp is 2000-01-01T00:00:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 3} timestamp is 2000-01-01T00:03:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 2} timestamp is 2000-01-01T00:01:59.999Z
+</code></pre>
+</div>
+
+<blockquote>
+ <p>Note: The lack of order in the output should be expected, however the
+key-window tuple is correctly computed.</p>
+</blockquote>
+
+<p>As expected, we see output in each of the interval windows which had a data
+point with a timestamp between the minimum and maximum value of the window.
+There was a data point at timestamps 00:00:59, 00:01:59 and 00:03:59, which
+fell into the following interval windows.</p>
+
+<ul>
+ <li>[00:00:00, 00:00:59.999)</li>
+ <li>[00:01:00, 00:01:59.999)</li>
+ <li>[00:03:00, 00:03:59.999)</li>
+</ul>
+
+<p>But as there was no data between 00:02:00 and 00:02:59, no value is produced
+for interval window [00:02:00,00:02:59.999).</p>
+
+<p>How can we get Beam to output values for that missing window? First, let’s walk
+through some options that do not make use of the Timer API.</p>
+
+<h2 id="option-1-external-heartbeat">Option 1: External heartbeat</h2>
+
+<p>We can use an external system to emit a value for each time interval and inject
+it into the stream of data that Beam consumes. This simple option moves any
+complexity out of the Beam pipeline. But using an external system means we need
+to monitor this system and perform other maintenance tasks in tandem with the
+Beam pipeline.</p>
+
+<h2 id="option-2-use-a-generated-source-in-the-beam-pipeline">Option 2: Use a generated source in the Beam pipeline</h2>
+
+<p>We can use a generating source to emit the value using this code snippet:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>pipeline.apply(GenerateSequence.
+ from(0).withRate(1,Duration.standardSeconds(1L)))
+</code></pre>
+</div>
+
+<p>We can then:</p>
+
+<ol>
+ <li>Use a DoFn to convert the value to zero.</li>
+ <li>Flatten this value with the real source.</li>
+ <li>Produce a PCollection which has ticks in every time interval.</li>
+</ol>
+
+<p>This is also a simple way of producing a value in each time interval.</p>
+
+<h2 id="option-1--2-the-problem-with-multiple-keys">Option 1 &amp; 2 The problem with multiple keys</h2>
+
+<p>Both options 1 and 2 work well for the case where there the pipeline processes a
+single key. Let’s now deal with the case where instead of 1 IoT device, there
+are 1000s or 100,000s of these devices, each with a unique key. To make option 1
+or option 2 work in this scenario, we need to carry out an extra step: creating
+a FanOut DoFn. Each tick needs to be distributed to all the potential keys, so
+we need to create a FanOut DoFn that takes the dummy value and generates a
+key-value pair for every available key.</p>
+
+<p>For example, let’s assume we have 3 keys for 3 IoT devices, {key1,key2,key3}.
+Using the method we outlined in Option 2 when we get the first element from
+GenerateSequence, we need to create a loop in the DoFn that generates 3
+key-value pairs. These pairs become the heartbeat value for each of the IoT
+devices.</p>
+
+<p>And things get a lot more fun when we need to deal with lots of IoT devices,
+with a list of keys that are dynamically changing. We would need to add a
+transform that does a Distinct operation and feed the data produced as a
+side-input into the FanOut DoFn.</p>
+
+<h2 id="option-3-implementing-a-heartbeat-using-beam-timers">Option 3: Implementing a heartbeat using Beam timers</h2>
+
+<p>So how do timers help? Well let’s have a look at a new transform:</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">LoopingStatefulTimer</span> <span class="kd">extends</span> <span class="n">DoFn</span><span class="o">&lt;</span> [...]
+
+ <span class="n">Instant</span> <span class="n">stopTimerTime</span><span class="o">;</span>
+
+ <span class="n">LoopingStatefulTimer</span><span class="o">(</span><span class="n">Instant</span> <span class="n">stopTime</span><span class="o">){</span>
+ <span class="k">this</span><span class="o">.</span><span class="na">stopTimerTime</span> <span class="o">=</span> <span class="n">stopTime</span><span class="o">;</span>
+ <span class="o">}</span>
+
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"timerRunning"</span><span class="o">)</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span class="n">StateSpec</span><span class="o">&lt;</span><span class="n">ValueState</span><span class="o">&lt;</span><span class="n">Boolean</span><span class="o">&gt;&gt;</span> <span class="n">timerRunning</span [...]
+ <span class="n">StateSpecs</span><span class="o">.</span><span class="na">value</span><span class="o">(</span><span class="n">BooleanCoder</span><span class="o">.</span><span class="na">of</span><span class="o">());</span>
+
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"key"</span><span class="o">)</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span class="n">StateSpec</span><span class="o">&lt;</span><span class="n">ValueState</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;&gt;</span> <span class="n">key</span> <s [...]
+ <span class="n">StateSpecs</span><span class="o">.</span><span class="na">value</span><span class="o">(</span><span class="n">StringUtf8Coder</span><span class="o">.</span><span class="na">of</span><span class="o">());</span>
+
+ <span class="nd">@TimerId</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span class="n">TimerSpec</span> <span class="n">loopingTimer</span> <span class="o">=</span>
+ <span class="n">TimerSpecs</span><span class="o">.</span><span class="na">timer</span><span class="o">(</span><span class="n">TimeDomain</span><span class="o">.</span><span class="na">EVENT_TIME</span><span class="o">);</span>
+
+ <span class="nd">@ProcessElement</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">ProcessContext</span> <span class="n">c</span><span class="o">,</span> <span class="nd">@StateId</span><span class=&qu [...]
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"timerRunning"</span><span class="o">)</span> <span class="n">ValueState</span><span class="o">&lt;</span><span class="n">Boolean</span><span class="o">&gt;</span> <span class="n">timerRunning</span& [...]
+ <span class="nd">@TimerId</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span> <span class="n">Timer</span> <span class="n">loopingTimer</span><span class="o">)</span> <span class="o">{</span>
+
+ <span class="c1">// If the timer has been set already, do not reset</span>
+ <span class="k">if</span> <span class="o">(</span><span class="n">timerRunning</span><span class="o">.</span><span class="na">read</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">loopingTimer</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">c</span><span class="o">.</span><span class="na">timestamp</span><span class="o">().</span><span class="na">plus</span><span class="o">(</span& [...]
+ <span class="n">timerRunning</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
+ <span class="o">}</span>
+
+ <span class="c1">// We need this value so that we can output a value for the correct key in OnTimer</span>
+ <span class="k">if</span> <span class="o">(</span><span class="n">key</span><span class="o">.</span><span class="na">read</span><span class="o">()</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">key</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="n">c</span><span class="o">.</span><span class="na">element</span><span class="o">().</span><span class="na">getKey</span><span class="o">());</span>
+ <span class="o">}</span>
+
+ <span class="n">c</span><span class="o">.</span><span class="na">output</span><span class="o">(</span><span class="n">c</span><span class="o">.</span><span class="na">element</span><span class="o">());</span>
+ <span class="o">}</span>
+
+ <span class="nd">@OnTimer</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span>
+ <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onTimer</span><span class="o">(</span>
+ <span class="n">OnTimerContext</span> <span class="n">c</span><span class="o">,</span>
+ <span class="nd">@StateId</span><span class="o">(</span><span class="s">"key"</span><span class="o">)</span> <span class="n">ValueState</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">key</span><span class=& [...]
+ <span class="nd">@TimerId</span><span class="o">(</span><span class="s">"loopingTimer"</span><span class="o">)</span> <span class="n">Timer</span> <span class="n">loopingTimer</span><span class="o">)</span> <span class="o">{</span>
+
+ <span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">"Timer @ {} fired"</span><span class="o">,</span> <span class="n">c</span><span class="o">.</span><span class="na">timestamp</span><span class="o"& [...]
+ <span class="n">c</span><span class="o">.</span><span class="na">output</span><span class="o">(</span><span class="n">KV</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">key</span><span class="o">.</span><span class= [...]
+
+ <span class="c1">// If we do not put in a “time to live” value, then the timer would loop forever</span>
+ <span class="n">Instant</span> <span class="n">nextTimer</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="na">timestamp</span><span class="o">().</span><span class="na">plus</span><span class="o">(</span><span class="n">Duration [...]
+ <span class="k">if</span> <span class="o">(</span><span class="n">nextTimer</span><span class="o">.</span><span class="na">isBefore</span><span class="o">(</span><span class="n">stopTimerTime</span><span class="o">))</span> <span class="o">{</span>
+ <span class="n">loopingTimer</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">nextTimer</span><span class="o">);</span>
+ <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+ <span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span>
+ <span class="s">"Timer not being set as exceeded Stop Timer value {} "</span><span class="o">,</span>
+ <span class="n">stopTimerTime</span><span class="o">);</span>
+ <span class="o">}</span>
+ <span class="o">}</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<p>There are two data values that the state API needs to keep:</p>
+
+<ol>
+ <li>A boolean <code class="highlighter-rouge">timeRunning</code> value used to avoid resetting the timer if it’s
+already running.</li>
+ <li>A “<em>key</em>” state object value that allows us to store the key that we are
+working with. This information will be needed in the <code class="highlighter-rouge">OnTimer</code> event later.</li>
+</ol>
+
+<p>We also have a Timer with the ID <code class="highlighter-rouge">**loopingTimer**</code> that acts as our per
+interval alarm clock. Note that the timer is an <em>event timer</em>. It fires based on
+the watermark, not on the passage of time as the pipeline runs.</p>
+
+<p>Next, let’s unpack what’s happening in the @ProcessElement block:</p>
+
+<p>The first element to come to this block will:</p>
+
+<ol>
+ <li>Set the state of the <code class="highlighter-rouge">timerRunner</code> to True.</li>
+ <li>Write the value of the key from the key-value pair into the key StateValue.</li>
+ <li>The code sets the value of the timer to fire one minute after the elements
+timestamp. Note that the maximum value allowed for this timestamp is
+XX:XX:59.999. This places the maximum alarm value at the upper boundary of
+the next time interval.</li>
+ <li>Finally, we output the data from the <code class="highlighter-rouge">@ProcessElement</code> block using
+<code class="highlighter-rouge">c.output</code>.</li>
+</ol>
+
+<p>In the @OnTimer block, the following occurs:</p>
+
+<ol>
+ <li>The code emits a value with the key pulled from our key StateValue and a
+value of 0. The timestamp of the event corresponds to the event time of the
+timer firing.</li>
+ <li>We set a new timer for one minute from now, unless we are past the
+<code class="highlighter-rouge">stopTimerTime</code> value. Your use case will normally have more complex stopping
+conditions, but we use a simple condition here to allow us to keep the
+illustrated code simple. The topic of stopping conditions is discussed in
+more detail later.</li>
+</ol>
+
+<p>And that’s it, let’s add our transform back into the pipeline:</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code> <span class="c1">// Apply a fixed window of duration 1 min and Sum the results</span>
+ <span class="n">p</span><span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Create</span><span class="o">.</span><span class="na">timestamped</span><span class="o">(</span><span class="n">time_1</span><span class="o">,</span> < [...]
+ <span class="n">Window</span><span class="o">.&lt;</span><span class="n">KV</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Integer</span><span class="o">&gt;&gt;</span><span class="n">into</span><span class="o& [...]
+ <span class="c1">// We use a combiner to reduce the number of calls in keyed state</span>
+ <span class="c1">// from all elements to 1 per FixedWindow</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Sum</span><span class="o">.</span><span class="na">integersPerKey</span><span class="o">())</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Window</span><span class="o">.</span><span class="na">into</span><span class="o">(</span><span class="k">new</span> <span class="n">GlobalWindows</span><span class="o">()))</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">ParDo</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">LoopingStatefulTimer</span><span class="o">(</spa [...]
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Window</span><span class="o">.</span><span class="na">into</span><span class="o">(</span><span class="n">FixedWindows</span><span class="o">.</span><span class="na">of</span>& [...]
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">Sum</span><span class="o">.</span><span class="na">integersPerKey</span><span class="o">())</span>
+ <span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="n">ParDo</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="k">new</span> <span class="n">DoFn</span><span class="o">&lt;</span>< [...]
+
+ <span class="nd">@ProcessElement</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">ProcessContext</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span>
+
+ <span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">"Value is {} timestamp is {}"</span><span class="o">,</span> <span class="n">c</span><span class="o">.</span><span class="na">element</span><span class=&qu [...]
+
+ <span class="o">}</span>
+ <span class="o">}));</span>
+</code></pre>
+</div>
+
+<ol>
+ <li>In the first part of the pipeline we create FixedWindows and reduce the value
+per key down to a single Sum.</li>
+ <li>Next we re-window the output into a GlobalWindow. Since state and timers are
+per window, they must be set within the window boundary. We want the looping
+timer to span all the fixed windows, so we set it up in the global window.</li>
+ <li>We then add our LoopingStatefulTimer DoFn.</li>
+ <li>Finally, we reapply the FixedWindows and Sum our values.</li>
+</ol>
+
+<p>This pipeline ensures that a value of zero exists for each interval window, even
+if the Source of the pipeline emitted a value in the minimum and maximum
+boundaries of the interval window. This means that we can mark the absence of
+data.</p>
+
+<p>You might question why we use two reducers with multiple <code class="highlighter-rouge">Sum.integersPerKey</code>.
+Why not just use one? Functionally, using one would also produce the correct
+result. However, putting two <code class="highlighter-rouge">Sum.integersPerKey</code> gives us a nice performance
+advantage. It reduces the number of elements from many to just one per time
+interval. This can reduce the number of reads of the State API during the
+<code class="highlighter-rouge">@ProcessElement</code> calls.</p>
+
+<p>Here is the logging output of running our modified pipeline:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>INFO LoopingTimer - Timer @ 2000-01-01T00:01:59.999Z fired
+INFO LoopingTimer - Timer @ 2000-01-01T00:02:59.999Z fired
+INFO LoopingTimer - Timer @ 2000-01-01T00:03:59.999Z fired
+INFO LoopingTimer - Timer not being set as exceeded Stop Timer value 2000-01-01T00:04:00.000Z
+INFO LoopingTimer - Value is KV{Key_A, 1} timestamp is 2000-01-01T00:00:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 0} timestamp is 2000-01-01T00:02:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 2} timestamp is 2000-01-01T00:01:59.999Z
+INFO LoopingTimer - Value is KV{Key_A, 3} timestamp is 2000-01-01T00:03:59.999Z
+</code></pre>
+</div>
+
+<p>Yay! We now have output from the time interval [00:01:00, 00:01:59.999), even
+though the source dataset has no elements in that interval.</p>
+
+<p>In this blog, we covered one of the fun areas around time series use cases and
+worked through several options, including an advanced use case of the Timer API.
+Happy looping everyone!</p>
+
+<p><strong>Note:</strong> Looping timers is an interesting new use case for the Timer API and
+runners will need to add support for it with all of their more advanced
+feature sets. You can experiment with this pattern today using the
+DirectRunner. For other runners, please look out for their release notes on
+support for dealing with this use case in production.</p>
+
+<p>(<a href="/documentation/runners/capability-matrix/">Capability Matrix</a>)</p>
+
+<p>Runner specific notes:
+Google Cloud Dataflow Runners Drain feature does not support looping timers (Link to matrix)</p>
+</description>
+ <pubDate>Tue, 11 Jun 2019 01:00:01 -0700</pubDate>
+ <link>https://beam.apache.org/blog/2019/06/11/looping-timers.html</link>
+ <guid isPermaLink="true">https://beam.apache.org/blog/2019/06/11/looping-timers.html</guid>
+
+
+ <category>blog</category>
+
+ </item>
+
+ <item>
+ <title>Apache Beam 2.13.0</title>
+ <description><!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<p>We are happy to present the new 2.13.0 release of Beam. This release includes both improvements and new functionality.
+See the <a href="/get-started/downloads/#2130-2019-05-21">download page</a> for this release.<!--more-->
+For more information on changes in 2.13.0, check out the
+<a href="https://jira.apache.org/jira/secure/ReleaseNote.jspa?projectId=12319527&amp;version=12345166">detailed release notes</a>.</p>
+
+<h2 id="highlights">Highlights</h2>
+
+<h3 id="ios">I/Os</h3>
+
+<ul>
+ <li>Support reading query results with the BigQuery storage API.</li>
+ <li>Support KafkaIO to be configured externally for use with other SDKs.</li>
+ <li>BigQuery IO now supports BYTES datatype on Python 3.</li>
+ <li>Avro IO support enabled on Python 3.</li>
+ <li>For Python 3 pipelines, the default Avro library used by Beam AvroIO and Dataflow workers was switched from avro-python3 to fastavro.</li>
+</ul>
+
+<h3 id="new-features--improvements">New Features / Improvements</h3>
+
+<ul>
+ <li>Flink 1.8 support added.</li>
+ <li>Support to run word count on Portable Spark runner.</li>
+ <li>ElementCount metrics in FnApi Dataflow Runner.</li>
+ <li>Support to create BinaryCombineFn from lambdas.</li>
+</ul>
+
+<h3 id="breaking-changes">Breaking Changes</h3>
+<ul>
+ <li>When writing BYTES Datatype into Bigquery with Beam Bigquery IO on Python DirectRunner, users need to base64-encode bytes values before passing them to Bigquery IO. Accordingly, when reading bytes data from BigQuery, the IO will also return base64-encoded bytes. This change only affects Bigquery IO on Python DirectRunner. New DirectRunner behavior is consistent with treatment of Bytes by Beam Java Bigquery IO, and Python Dataflow Runner.</li>
+</ul>
+
+<h3 id="bugfixes">Bugfixes</h3>
+
+<ul>
+ <li>Various bug fixes and performance improvements.</li>
+</ul>
+
+<h2 id="list-of-contributors">List of Contributors</h2>
+
+<p>According to git shortlog, the following people contributed to the 2.13.0 release. Thank you to all contributors!</p>
+
+<p>Aaron Li, Ahmet Altay, Aizhamal Nurmamat kyzy, Alex Amato, Alexey Romanenko,
+Andrew Pilloud, Ankur Goenka, Anton Kedin, apstndb, Boyuan Zhang, Brian Hulette,
+Brian Quinlan, Chamikara Jayalath, Cyrus Maden, Daniel Chen, Daniel Oliveira,
+David Cavazos, David Moravek, David Yan, EdgarLGB, Etienne Chauchot, frederik2,
+Gleb Kanterov, Harshit Dwivedi, Harsh Vardhan, Heejong Lee, Hennadiy Leontyev,
+Henri-Mayeul de Benque, Ismaël Mejía, Jae-woo Kim, Jamie Kirkpatrick, Jan Lukavský,
+Jason Kuster, Jean-Baptiste Onofré, JohnZZGithub, Jozef Vilcek, Juta, Kenneth Jung,
+Kenneth Knowles, Kyle Weaver, Łukasz Gajowy, Luke Cwik, Mark Liu, Mathieu Blanchard,
+Maximilian Michels, Melissa Pashniak, Michael Luckey, Michal Walenia, Mike Kaplinskiy,
+Mike Pedersen, Mikhail Gryzykhin, Mikhail-Ivanov, Niklas Hansson, pabloem,
+Pablo Estrada, Pranay Nanda, Reuven Lax, Richard Moorhead, Robbe Sneyders,
+Robert Bradshaw, Robert Burke, Roman van der Krogt, rosetn, Rui Wang, Ryan Yuan,
+Sam Whittle, sudhan499, Sylwester Kardziejonek, Ted, Thomas Weise, Tim Robertson,
+ttanay, tvalentyn, Udi Meiri, Valentyn Tymofieiev, Xinyu Liu, Yifan Zou,
+yoshiki.obata, Yueyang Qiu</p>
+</description>
+ <pubDate>Fri, 07 Jun 2019 01:00:01 -0700</pubDate>
+ <link>https://beam.apache.org/blog/2019/05/22/beam-2.13.0.html</link>
+ <guid isPermaLink="true">https://beam.apache.org/blog/2019/05/22/beam-2.13.0.html</guid>
+
+
+ <category>blog</category>
+
+ </item>
+
+ <item>
<title>Adding new Data Sources to Beam SQL CLI</title>
<description><!--
Licensed under the Apache License, Version 2.0 (the "License");
@@ -281,88 +715,6 @@ useful for people to learn more about Apache Beam, and eventually become Beam Ma
</item>
<item>
- <title>Apache Beam 2.13.0</title>
- <description><!--
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<p>We are happy to present the new 2.13.0 release of Beam. This release includes both improvements and new functionality.
-See the <a href="/get-started/downloads/#2130-2019-05-21">download page</a> for this release.<!--more-->
-For more information on changes in 2.13.0, check out the
-<a href="https://jira.apache.org/jira/secure/ReleaseNote.jspa?projectId=12319527&amp;version=12345166">detailed release notes</a>.</p>
-
-<h2 id="highlights">Highlights</h2>
-
-<h3 id="ios">I/Os</h3>
-
-<ul>
- <li>Support reading query results with the BigQuery storage API.</li>
- <li>Support KafkaIO to be configured externally for use with other SDKs.</li>
- <li>BigQuery IO now supports BYTES datatype on Python 3.</li>
- <li>Avro IO support enabled on Python 3.</li>
- <li>For Python 3 pipelines, the default Avro library used by Beam AvroIO and Dataflow workers was switched from avro-python3 to fastavro.</li>
-</ul>
-
-<h3 id="new-features--improvements">New Features / Improvements</h3>
-
-<ul>
- <li>Flink 1.8 support added.</li>
- <li>Support to run word count on Portable Spark runner.</li>
- <li>ElementCount metrics in FnApi Dataflow Runner.</li>
- <li>Support to create BinaryCombineFn from lambdas.</li>
-</ul>
-
-<h3 id="breaking-changes">Breaking Changes</h3>
-<ul>
- <li>When writing BYTES Datatype into Bigquery with Beam Bigquery IO on Python DirectRunner, users need to base64-encode bytes values before passing them to Bigquery IO. Accordingly, when reading bytes data from BigQuery, the IO will also return base64-encoded bytes. This change only affects Bigquery IO on Python DirectRunner. New DirectRunner behavior is consistent with treatment of Bytes by Beam Java Bigquery IO, and Python Dataflow Runner.</li>
-</ul>
-
-<h3 id="bugfixes">Bugfixes</h3>
-
-<ul>
- <li>Various bug fixes and performance improvements.</li>
-</ul>
-
-<h2 id="list-of-contributors">List of Contributors</h2>
-
-<p>According to git shortlog, the following people contributed to the 2.13.0 release. Thank you to all contributors!</p>
-
-<p>Aaron Li, Ahmet Altay, Aizhamal Nurmamat kyzy, Alex Amato, Alexey Romanenko,
-Andrew Pilloud, Ankur Goenka, Anton Kedin, apstndb, Boyuan Zhang, Brian Hulette,
-Brian Quinlan, Chamikara Jayalath, Cyrus Maden, Daniel Chen, Daniel Oliveira,
-David Cavazos, David Moravek, David Yan, EdgarLGB, Etienne Chauchot, frederik2,
-Gleb Kanterov, Harshit Dwivedi, Harsh Vardhan, Heejong Lee, Hennadiy Leontyev,
-Henri-Mayeul de Benque, Ismaël Mejía, Jae-woo Kim, Jamie Kirkpatrick, Jan Lukavský,
-Jason Kuster, Jean-Baptiste Onofré, JohnZZGithub, Jozef Vilcek, Juta, Kenneth Jung,
-Kenneth Knowles, Kyle Weaver, Łukasz Gajowy, Luke Cwik, Mark Liu, Mathieu Blanchard,
-Maximilian Michels, Melissa Pashniak, Michael Luckey, Michal Walenia, Mike Kaplinskiy,
-Mike Pedersen, Mikhail Gryzykhin, Mikhail-Ivanov, Niklas Hansson, pabloem,
-Pablo Estrada, Pranay Nanda, Reuven Lax, Richard Moorhead, Robbe Sneyders,
-Robert Bradshaw, Robert Burke, Roman van der Krogt, rosetn, Rui Wang, Ryan Yuan,
-Sam Whittle, sudhan499, Sylwester Kardziejonek, Ted, Thomas Weise, Tim Robertson,
-ttanay, tvalentyn, Udi Meiri, Valentyn Tymofieiev, Xinyu Liu, Yifan Zou,
-yoshiki.obata, Yueyang Qiu</p>
-</description>
- <pubDate>Wed, 22 May 2019 01:00:01 -0700</pubDate>
- <link>https://beam.apache.org/blog/2019/05/22/beam-2.13.0.html</link>
- <guid isPermaLink="true">https://beam.apache.org/blog/2019/05/22/beam-2.13.0.html</guid>
-
-
- <category>blog</category>
-
- </item>
-
- <item>
<title>Beam community update!</title>
<description><!--
Licensed under the Apache License, Version 2.0 (the "License");
@@ -878,135 +1230,5 @@ Valentyn Tymofieiev, Xinyu Liu, Xu Mingmin, Łukasz Gajowy.</p>
</item>
- <item>
- <title>Apache Beam 2.10.0</title>
- <description><!--
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<p>We are happy to present the new 2.10.0 release of Beam. This release includes both improvements and new functionality.
-See the <a href="/get-started/downloads/#2100-2019-02-01">download page</a> for this release.<!--more-->
-For more information on changes in 2.10.0, check out the
-<a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12319527&amp;version=12344540">detailed release notes</a>.</p>
-
-<h2 id="highlights">Highlights</h2>
-
-<h3 id="dependency-upgradeschanges">Dependency Upgrades/Changes</h3>
-
-<ul>
- <li>FlinkRunner: Flink 1.5.x/1.6.x/1.7.x</li>
- <li>Java: AutoValue 1.6.3</li>
- <li>Java: Jackson 2.9.8</li>
- <li>Java: google_cloud_bigdataoss 1.9.13</li>
- <li>Java: Apache Commons Codec: 1.10</li>
- <li>Python: avro&gt;=1.8.1,&lt;2.0.0; python_version &lt; “3.0”</li>
- <li>Python: avro-python3&gt;=1.8.1,&lt;2.0.0; python_version &gt;= “3.0”</li>
- <li>Python: bigdataoss_gcsio 1.9.12</li>
- <li>Python: dill&gt;=0.2.9,&lt;0.2.10</li>
- <li>Python: gcsio 1.9.13</li>
- <li>Python: google-cloud-pubsub 0.39.0</li>
- <li>Python: pytz&gt;=2018.3</li>
- <li>Python: pyyaml&gt;=3.12,&lt;4.0.0</li>
- <li>MongoDbIO: mongo client 3.9.1</li>
-</ul>
-
-<h3 id="ios">I/Os</h3>
-
-<ul>
- <li>ParquetIO for Python SDK</li>
- <li>HadoopOutputFormatIO: Add batching support</li>
- <li>HadoopOutputFormatIO: Add streaming support</li>
- <li>MongoDbIO: Add projections</li>
- <li>MongoDbIO: Add support for server with self signed SSL</li>
- <li>MongoDbIO add ordered option (inserts documents even if errors)</li>
- <li>KafkaIO: Add support to write to multiple topics</li>
- <li>KafkaIO: add writing support with ProducerRecord</li>
- <li>CassandraIO: Add ability to delete data</li>
- <li>JdbcIO: Add ValueProvider support for Statement in JdbcIO.write(), so it can be templatized</li>
-</ul>
-
-<h3 id="new-features--improvements">New Features / Improvements</h3>
-
-<ul>
- <li>FlinkRunner: support Flink config directory</li>
- <li>FlinkRunner: master url now supports IPv6 addresses</li>
- <li>FlinkRunner: portable runner savepoint / upgrade support</li>
- <li>FlinkRunner: can be built against different Flink versions</li>
- <li>FlinkRunner: Send metrics to Flink in portable runner</li>
- <li>Java: Migrate to vendored gRPC (no conflicts with user gRPC, smaller jars)</li>
- <li>Java: Migrate to vendored Guava (no conflicts with user Guava, smaller jars)</li>
- <li>SQL: support joining unbounded to bounded sources via side input (and is no longer sensitive to left vs right join)</li>
- <li>SQL: support table macro</li>
- <li>Schemas: support for Avro, with automatic schema registration</li>
- <li>Schemas: Automatic schema registration for AutoValue classes</li>
-</ul>
-
-<h3 id="bugfixes">Bugfixes</h3>
-
-<ul>
- <li>Watch PTransform fixed (affects FileIO)</li>
- <li>FlinkRunner: no longer fails if GroupByKey contains null values (streaming mode only)</li>
- <li>FlinkRunner: no longer prepares to-be-staged file too late</li>
- <li>FlinkRunner: sets number of shards for writes with runner determined sharding</li>
- <li>FlinkRunner: prevents CheckpointMarks from not getting acknowledged</li>
- <li>Schemas: Generated row object for POJOs, Avros, and JavaBeans should work if the wrapped class is package private</li>
- <li>Schemas: Nested collection types in schemas no longer cause NullPointerException when converting to a POJO</li>
- <li>BigQueryIO: now handles quotaExceeded errors properly</li>
- <li>BigQueryIO: now handles triggering correctly in certain very large load jobs</li>
- <li>FileIO and other file-based IOs: Beam LocalFilesystem now matches glob patterns in windows</li>
- <li>SQL: joins no longer moves timestamps to the end of the window</li>
- <li>SQL: was missing some transitive dependencies</li>
- <li>SQL: JDBC driver no longer breaks interactions with other JDBC sources</li>
- <li>pyarrow supported on Windows Python 2</li>
-</ul>
-
-<h3 id="deprecations">Deprecations</h3>
-
-<ul>
- <li>Deprecate HadoopInputFormatIO</li>
-</ul>
-
-<h2 id="list-of-contributors">List of Contributors</h2>
-
-<p>According to git shortlog, the following people contributed
-to the 2.10.0 release. Thank you to all contributors!</p>
-
-<p>Ahmet Altay, Alan Myrvold, Alex Amato, Alexey Romanenko, Anton Kedin, Rui Wang,
-Andrew Brampton Andrew Pilloud, Ankur Goenka, Antonio D’souza, Bingfeng Shu,
-Boyuan Zhang, brucearctor, Cade Markegard, Chaim Turkel, Chamikara Jayalath,
-Charles Chen, Colm O hEigeartaigh, Cory, Craig Chambers, Cristian, Daniel
-Mills, Daniel Oliveira, David Cavazos, David Hrbacek, David Moravek, Dawid
-Wysakowicz, djhworld, Dustin Rhodes, Etienne Chauchot, Fabien Rousseau, Garrett
-Jones, Gleb Kanterov, Heejong Lee, Ismaël Mejía, Jason Kuster, Jean-Baptiste
-Onofré, Jeff Klukas, Joar Wandborg, Jozef Vilcek, Kadir Cetinkaya, Kasia
-Kucharczyk, Kengo Seki, Kenneth Knowles, lcaggio, Lukasz Cwik, Łukasz Gajowy,
-Manu Zhang, marek.simunek, Mark Daoust, Mark Liu, Maximilian Michels, Melissa
-Pashniak, Michael Luckey, Mikhail Gryzykhin, mlotstein, morokosi, Niel
-Markwick, Pablo Estrada, Prem Kumar Karunakaran, Reuven Lax, robbe, Robbe
-Sneyders, Robert Bradshaw, Robert Burke, Ruoyun Huang, Ryan Williams, Sam
-Whittle, Scott Wegner, Slava Chernyak, Theodore Siu, Thomas Weise, Udi Meiri,
-vaclav.plajt@gmail.com, Valentyn Tymofieiev, Won Wook SONG, Wout Scheepers,
-Xinyu Liu, Yueyang Qiu, Zhuo Peng</p>
-
-</description>
- <pubDate>Fri, 15 Feb 2019 00:00:01 -0800</pubDate>
- <link>https://beam.apache.org/blog/2019/02/15/beam-2.10.0.html</link>
- <guid isPermaLink="true">https://beam.apache.org/blog/2019/02/15/beam-2.10.0.html</guid>
-
-
- <category>blog</category>
-
- </item>
-
</channel>
</rss>
diff --git a/website/generated-content/get-started/beam-overview/index.html b/website/generated-content/get-started/beam-overview/index.html
index e949d37..1d051b9 100644
--- a/website/generated-content/get-started/beam-overview/index.html
+++ b/website/generated-content/get-started/beam-overview/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/downloads/index.html b/website/generated-content/get-started/downloads/index.html
index 73f5f78..8abaf98 100644
--- a/website/generated-content/get-started/downloads/index.html
+++ b/website/generated-content/get-started/downloads/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/index.html b/website/generated-content/get-started/index.html
index 0d05351..3b3b3d6 100644
--- a/website/generated-content/get-started/index.html
+++ b/website/generated-content/get-started/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/mobile-gaming-example/index.html b/website/generated-content/get-started/mobile-gaming-example/index.html
index 1004140..28ce744 100644
--- a/website/generated-content/get-started/mobile-gaming-example/index.html
+++ b/website/generated-content/get-started/mobile-gaming-example/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/quickstart-go/index.html b/website/generated-content/get-started/quickstart-go/index.html
index bb14f29..1d6a1b6 100644
--- a/website/generated-content/get-started/quickstart-go/index.html
+++ b/website/generated-content/get-started/quickstart-go/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/quickstart-java/index.html b/website/generated-content/get-started/quickstart-java/index.html
index e58674f..bb33e4b 100644
--- a/website/generated-content/get-started/quickstart-java/index.html
+++ b/website/generated-content/get-started/quickstart-java/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/quickstart-py/index.html b/website/generated-content/get-started/quickstart-py/index.html
index fab6a5b..d3d116f 100644
--- a/website/generated-content/get-started/quickstart-py/index.html
+++ b/website/generated-content/get-started/quickstart-py/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/try-apache-beam/index.html b/website/generated-content/get-started/try-apache-beam/index.html
index bd3fefa..c02ab17 100644
--- a/website/generated-content/get-started/try-apache-beam/index.html
+++ b/website/generated-content/get-started/try-apache-beam/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/get-started/wordcount-example/index.html b/website/generated-content/get-started/wordcount-example/index.html
index 1ecc7de..4e85eab 100644
--- a/website/generated-content/get-started/wordcount-example/index.html
+++ b/website/generated-content/get-started/wordcount-example/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/index.html b/website/generated-content/index.html
index 37241fe..a1df2df 100644
--- a/website/generated-content/index.html
+++ b/website/generated-content/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
@@ -177,19 +193,19 @@ limitations under the License.
</div>
<div class="hero__blog__cards">
- <a class="hero__blog__cards__card" href="/blog/2019/06/04/adding-data-sources-to-sql.html">
- <div class="hero__blog__cards__card__title">Adding new Data Sources to Beam SQL CLI</div>
- <div class="hero__blog__cards__card__date">Jun 4, 2019</div>
- </a>
-
- <a class="hero__blog__cards__card" href="/blog/2019/05/30/beam-kata-release.html">
- <div class="hero__blog__cards__card__title">Apache Beam Katas</div>
- <div class="hero__blog__cards__card__date">May 30, 2019</div>
+ <a class="hero__blog__cards__card" href="/blog/2019/06/11/looping-timers.html">
+ <div class="hero__blog__cards__card__title">Looping timers in Apache Beam</div>
+ <div class="hero__blog__cards__card__date">Jun 11, 2019</div>
</a>
<a class="hero__blog__cards__card" href="/blog/2019/05/22/beam-2.13.0.html">
<div class="hero__blog__cards__card__title">Apache Beam 2.13.0</div>
- <div class="hero__blog__cards__card__date">May 22, 2019</div>
+ <div class="hero__blog__cards__card__date">Jun 7, 2019</div>
+ </a>
+
+ <a class="hero__blog__cards__card" href="/blog/2019/06/04/adding-data-sources-to-sql.html">
+ <div class="hero__blog__cards__card__title">Adding new Data Sources to Beam SQL CLI</div>
+ <div class="hero__blog__cards__card__date">Jun 4, 2019</div>
</a>
</div>
diff --git a/website/generated-content/privacy_policy/index.html b/website/generated-content/privacy_policy/index.html
index 01e8397..6f4ddbf 100644
--- a/website/generated-content/privacy_policy/index.html
+++ b/website/generated-content/privacy_policy/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/apex-runner/index.html b/website/generated-content/roadmap/apex-runner/index.html
index 4137713..a3dbf1b 100644
--- a/website/generated-content/roadmap/apex-runner/index.html
+++ b/website/generated-content/roadmap/apex-runner/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/connectors-go-sdk/index.html b/website/generated-content/roadmap/connectors-go-sdk/index.html
index e20326f..ba9da46 100644
--- a/website/generated-content/roadmap/connectors-go-sdk/index.html
+++ b/website/generated-content/roadmap/connectors-go-sdk/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/connectors-java-sdk/index.html b/website/generated-content/roadmap/connectors-java-sdk/index.html
index a75212d..fdb747f 100644
--- a/website/generated-content/roadmap/connectors-java-sdk/index.html
+++ b/website/generated-content/roadmap/connectors-java-sdk/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/connectors-multi-sdk/index.html b/website/generated-content/roadmap/connectors-multi-sdk/index.html
index 7b5b912..756e596 100644
--- a/website/generated-content/roadmap/connectors-multi-sdk/index.html
+++ b/website/generated-content/roadmap/connectors-multi-sdk/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/connectors-python-sdk/index.html b/website/generated-content/roadmap/connectors-python-sdk/index.html
index 6469ca0..cd53650 100644
--- a/website/generated-content/roadmap/connectors-python-sdk/index.html
+++ b/website/generated-content/roadmap/connectors-python-sdk/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/dataflow-runner/index.html b/website/generated-content/roadmap/dataflow-runner/index.html
index 7a56c9d..06b1139 100644
--- a/website/generated-content/roadmap/dataflow-runner/index.html
+++ b/website/generated-content/roadmap/dataflow-runner/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/euphoria/index.html b/website/generated-content/roadmap/euphoria/index.html
index 78c66b6..50ab424 100644
--- a/website/generated-content/roadmap/euphoria/index.html
+++ b/website/generated-content/roadmap/euphoria/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/flink-runner/index.html b/website/generated-content/roadmap/flink-runner/index.html
index 279325b..30d6eba 100644
--- a/website/generated-content/roadmap/flink-runner/index.html
+++ b/website/generated-content/roadmap/flink-runner/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/gearpump-runner/index.html b/website/generated-content/roadmap/gearpump-runner/index.html
index 27cf713..016a1cd 100644
--- a/website/generated-content/roadmap/gearpump-runner/index.html
+++ b/website/generated-content/roadmap/gearpump-runner/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/go-sdk/index.html b/website/generated-content/roadmap/go-sdk/index.html
index 55612b8..41ffda2 100644
--- a/website/generated-content/roadmap/go-sdk/index.html
+++ b/website/generated-content/roadmap/go-sdk/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/index.html b/website/generated-content/roadmap/index.html
index ffe9bc8..f9c3ae0 100644
--- a/website/generated-content/roadmap/index.html
+++ b/website/generated-content/roadmap/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/java-sdk/index.html b/website/generated-content/roadmap/java-sdk/index.html
index eadb4d5..15c2b15 100644
--- a/website/generated-content/roadmap/java-sdk/index.html
+++ b/website/generated-content/roadmap/java-sdk/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/nemo-runner/index.html b/website/generated-content/roadmap/nemo-runner/index.html
index b2cd9ab..67185c3 100644
--- a/website/generated-content/roadmap/nemo-runner/index.html
+++ b/website/generated-content/roadmap/nemo-runner/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/portability/index.html b/website/generated-content/roadmap/portability/index.html
index f527b04..77324c6 100644
--- a/website/generated-content/roadmap/portability/index.html
+++ b/website/generated-content/roadmap/portability/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/python-sdk/index.html b/website/generated-content/roadmap/python-sdk/index.html
index 5725501..8d26953 100644
--- a/website/generated-content/roadmap/python-sdk/index.html
+++ b/website/generated-content/roadmap/python-sdk/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/samza-runner/index.html b/website/generated-content/roadmap/samza-runner/index.html
index 4865d46..def167e 100644
--- a/website/generated-content/roadmap/samza-runner/index.html
+++ b/website/generated-content/roadmap/samza-runner/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/spark-runner/index.html b/website/generated-content/roadmap/spark-runner/index.html
index 6e20ae2..ff057a1 100644
--- a/website/generated-content/roadmap/spark-runner/index.html
+++ b/website/generated-content/roadmap/spark-runner/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">
diff --git a/website/generated-content/roadmap/sql/index.html b/website/generated-content/roadmap/sql/index.html
index 7b2e8b0..36f81ac 100644
--- a/website/generated-content/roadmap/sql/index.html
+++ b/website/generated-content/roadmap/sql/index.html
@@ -108,6 +108,22 @@
<li><a href="/blog">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
+ <li>
+ <div style="width: 300px;">
+ <script>
+ (function() {
+ var cx = '012923275103528129024:4emlchv9wzi';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+ </li>
<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:20px;"><span class="caret"></span></a>
<ul class="dropdown-menu dropdown-menu-right">