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 67daf41 Publishing website 2019/09/11 17:15:01 at commit 40ccf08 67daf41 is described below commit 67daf41daf5cf82751ee998261f2234c5a22dde4 Author: jenkins <bui...@apache.org> AuthorDate: Wed Sep 11 17:15:01 2019 +0000 Publishing website 2019/09/11 17:15:01 at commit 40ccf08 --- .../transforms/python/elementwise/pardo/index.html | 306 ++++++++++++++++++++- 1 file changed, 293 insertions(+), 13 deletions(-) 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 cac7dd6..eb7ac6d 100644 --- a/website/generated-content/documentation/transforms/python/elementwise/pardo/index.html +++ b/website/generated-content/documentation/transforms/python/elementwise/pardo/index.html @@ -447,7 +447,13 @@ <ul class="nav"> - <li><a href="#examples">Examples</a></li> + <li><a href="#examples">Examples</a> + <ul> + <li><a href="#example-1-pardo-with-a-simple-dofn">Example 1: ParDo with a simple DoFn</a></li> + <li><a href="#example-2-pardo-with-timestamp-and-window-information">Example 2: ParDo with timestamp and window information</a></li> + <li><a href="#example-3-pardo-with-dofn-methods">Example 3: ParDo with DoFn methods</a></li> + </ul> + </li> <li><a href="#related-transforms">Related transforms</a></li> </ul> @@ -470,30 +476,304 @@ limitations under the License. --> <h1 id="pardo">ParDo</h1> -<table align="left"> - <a target="_blank" class="button" href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.ParDo"> + +<script type="text/javascript"> +localStorage.setItem('language', 'language-py') +</script> + +<table> + <td> + <a class="button" target="_blank" href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.ParDo"> <img src="https://beam.apache.org/images/logos/sdks/python.png" width="20px" height="20px" alt="Pydoc" /> - Pydoc + Pydoc </a> + </td> </table> -<p><br /> -A transform for generic parallel processing. A <code class="highlighter-rouge">ParDo</code> transform considers each -element in the input <code class="highlighter-rouge">PCollection</code>, performs some processing function -(your user code) on that element, and emits zero or more elements to -an output PCollection.</p> +<p><br /></p> + +<p>A transform for generic parallel processing. +A <code class="highlighter-rouge">ParDo</code> transform considers each element in the input <code class="highlighter-rouge">PCollection</code>, +performs some processing function (your user code) on that element, +and emits zero or more elements to an output <code class="highlighter-rouge">PCollection</code>.</p> -<p>See more information in the <a href="/documentation/programming-guide/#pardo">Beam Programming Guide</a>.</p> +<p>See more information in the +<a href="/documentation/programming-guide/#pardo">Beam Programming Guide</a>.</p> <h2 id="examples">Examples</h2> -<p>See <a href="https://issues.apache.org/jira/browse/BEAM-7389">BEAM-7389</a> for updates.</p> + +<p>In the following examples, we explore how to create custom <code class="highlighter-rouge">DoFn</code>s and access +the timestamp and windowing information.</p> + +<h3 id="example-1-pardo-with-a-simple-dofn">Example 1: ParDo with a simple DoFn</h3> + +<p>The following example defines a simple <code class="highlighter-rouge">DoFn</code> class called <code class="highlighter-rouge">SplitWords</code> +which stores the <code class="highlighter-rouge">delimiter</code> as an object field. +The <code class="highlighter-rouge">process</code> method is called once per element, +and it can yield zero or more output elements.</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="k">class</span> <span class="nc">SplitWords</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="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s">','</span><span class="p">):</span> + <span class="bp">self</span><span class="o">.</span><span class="n">delimiter</span> <span class="o">=</span> <span class="n">delimiter</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">text</span><span class="p">):</span> + <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delimiter</span><span class="p">):</span> + <span class="k">yield</span> <span class="n">word</span> + +<span class="k">with</span> <span class="n">beam</span><span class="o">.</span><span class="n">Pipeline</span><span class="p">()</span> <span class="k">as</span> <span class="n">pipeline</span><span class="p">:</span> + <span class="n">plants</span> <span class="o">=</span> <span class="p">(</span> + <span class="n">pipeline</span> + <span class="o">|</span> <span class="s">'Gardening plants'</span> <span class="o">>></span> <span class="n">beam</span><span class="o">.</span><span class="n">Create</span><span class="p">([</span> + <span class="s">'🍓Strawberry,🥕Carrot,🍆Eggplant'</span><span class="p">,</span> + <span class="s">'🍅Tomato,🥔Potato'</span><span class="p">,</span> + <span class="p">])</span> + <span class="o">|</span> <span class="s">'Split words'</span> <span class="o">>></span> <span class="n">beam</span><span class="o">.</span><span class="n">ParDo</span><span class="p">(</span><span class="n">SplitWords</span><span class="p">(</span><span class="s">','</span><span class="p">))</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="k">print</span><span class="p">)</span> + <span class="p">)</span> +</code></pre> +</div> + +<p>Output <code class="highlighter-rouge">PCollection</code> after <code class="highlighter-rouge">ParDo</code>:</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>plants = [ + '🍓Strawberry', + '🥕Carrot', + '🍆Eggplant', + '🍅Tomato', + '🥔Potato', +] +</code></pre> +</div> + +<table> + <td> + <a class="button" target="_blank" href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/snippets/transforms/element_wise/pardo.py"> + <img src="https://www.tensorflow.org/images/GitHub-Mark-32px.png" width="20px" height="20px" alt="View on GitHub" /> + View on GitHub + </a> + </td> +</table> +<p><br /></p> + +<h3 id="example-2-pardo-with-timestamp-and-window-information">Example 2: ParDo with timestamp and window information</h3> + +<p>In this example, we add new parameters to the <code class="highlighter-rouge">process</code> method to bind parameter values at runtime.</p> + +<ul> + <li><a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn.TimestampParam"><code class="highlighter-rouge">beam.DoFn.TimestampParam</code></a> +binds the timestamp information as an +<a href="https://beam.apache.org/releases/pydoc/current/apache_beam.utils.timestamp.html#apache_beam.utils.timestamp.Timestamp"><code class="highlighter-rouge">apache_beam.utils.timestamp.Timestamp</code></a> +object.</li> + <li><a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn.WindowParam"><code class="highlighter-rouge">beam.DoFn.WindowParam</code></a> +binds the window information as the appropriate +<a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.window.html"><code class="highlighter-rouge">apache_beam.transforms.window.*Window</code></a> +object.</li> +</ul> + +<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">AnalyzeElement</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="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">elem</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><sp [...] + <span class="k">yield</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="o">.</span><span class="n">join</span><span class="p">([</span> + <span class="s">'# timestamp'</span><span class="p">,</span> + <span class="s">'type(timestamp) -> '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">timestamp</span><span class="p">)),</span> + <span class="s">'timestamp.micros -> '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">timestamp</span><span class="o">.</span><span class="n">micros</span><span class="p">),</span> + <span class="s">'timestamp.to_rfc3339() -> '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">timestamp</span><span class="o">.</span><span class="n">to_rfc3339</span><span class="p">()),</span> + <span class="s">'timestamp.to_utc_datetime() -> '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">timestamp</span><span class="o">.</span><span class="n">to_utc_datetime</span><span class="p">()),</span> + <span class="s">''</span><span class="p">,</span> + <span class="s">'# window'</span><span class="p">,</span> + <span class="s">'type(window) -> '</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">window</span><span class="p">)),</span> + <span class="s">'window.start -> {} ({})'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">window</span><span class="o">.</span><span class="n">start</span><span class="p">,</span> <span class="n">window</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">to_utc_datetime</span><span class="p">()),</span> + <span class="s">'window.end -> {} ({})'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">window</span><span class="o">.</span><span class="n">end</span><span class="p">,</span> <span class="n">window</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">to_utc_datetime</span><span class="p">()),</span> + <span class="s">'window.max_timestamp() -> {} ({})'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">window</span><span class="o">.</span><span class="n">max_timestamp</span><span class="p">(),</span> <span class="n">window</span><span class="o">.</span><span class="n">max_timestamp</span><span class="p">()</span><span class="o">.</span><span class="n">to_utc_datetime</span><span class="p">()),</span> + <span class="p">])</span> + +<span class="k">with</span> <span class="n">beam</span><span class="o">.</span><span class="n">Pipeline</span><span class="p">()</span> <span class="k">as</span> <span class="n">pipeline</span><span class="p">:</span> + <span class="n">dofn_params</span> <span class="o">=</span> <span class="p">(</span> + <span class="n">pipeline</span> + <span class="o">|</span> <span class="s">'Create a single test element'</span> <span class="o">>></span> <span class="n">beam</span><span class="o">.</span><span class="n">Create</span><span class="p">([</span><span class="s">':)'</span><span class="p">])</span> + <span class="o">|</span> <span class="s">'Add timestamp (Spring equinox 2020)'</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="k">lambda</span> <span class="n">elem</span><span class="p">:</span> <span class="n">beam</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">TimestampedValue</span><span class="p">(</span><span class="n">elem</span><span class="p">,</span> <span class="mi">1584675660</span><span class="p">))</span> + <span class="o">|</span> <span class="s">'Fixed 30sec windows'</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">beam</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">FixedWindows</span><span class="p">(</span><span class="mi">30</span><span class="p">))</span> + <span class="o">|</span> <span class="s">'Analyze element'</span> <span class="o">>></span> <span class="n">beam</span><span class="o">.</span><span class="n">ParDo</span><span class="p">(</span><span class="n">AnalyzeElement</span><span class="p">())</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="k">print</span><span class="p">)</span> + <span class="p">)</span> +</code></pre> +</div> + +<p><code class="highlighter-rouge">stdout</code> output:</p> + +<div class="highlighter-rouge"><pre class="highlight"><code># timestamp +type(timestamp) -> <class 'apache_beam.utils.timestamp.Timestamp'> +timestamp.micros -> 1584675660000000 +timestamp.to_rfc3339() -> '2020-03-20T03:41:00Z' +timestamp.to_utc_datetime() -> datetime.datetime(2020, 3, 20, 3, 41) + +# window +type(window) -> <class 'apache_beam.transforms.window.IntervalWindow'> +window.start -> Timestamp(1584675660) (2020-03-20 03:41:00) +window.end -> Timestamp(1584675690) (2020-03-20 03:41:30) +window.max_timestamp() -> Timestamp(1584675689.999999) (2020-03-20 03:41:29.999999) +</code></pre> +</div> + +<table> + <td> + <a class="button" target="_blank" href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/snippets/transforms/element_wise/pardo.py"> + <img src="https://www.tensorflow.org/images/GitHub-Mark-32px.png" width="20px" height="20px" alt="View on GitHub" /> + View on GitHub + </a> + </td> +</table> +<p><br /></p> + +<h3 id="example-3-pardo-with-dofn-methods">Example 3: ParDo with DoFn methods</h3> + +<p>A <a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn"><code class="highlighter-rouge">DoFn</code></a> +can be customized with a number of methods that can help create more complex behaviors. +You can customize what a worker does when it starts and shuts down with <code class="highlighter-rouge">setup</code> and <code class="highlighter-rouge">teardown</code>. +You can also customize what to do when a +<a href="https://beam.apache.org/documentation/execution-model/#bundling-and-persistence"><em>bundle of elements</em></a> +starts and finishes with <code class="highlighter-rouge">start_bundle</code> and <code class="highlighter-rouge">finish_bundle</code>.</p> + +<ul> + <li> + <p><a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn.setup"><code class="highlighter-rouge">DoFn.setup()</code></a>: +Called <em>once per <code class="highlighter-rouge">DoFn</code> instance</em> when the <code class="highlighter-rouge">DoFn</code> instance is initialized. +<code class="highlighter-rouge">setup</code> need not to be cached, so it could be called more than once per worker. +This is a good place to connect to database instances, open network connections or other resources.</p> + </li> + <li> + <p><a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn.start_bundle"><code class="highlighter-rouge">DoFn.start_bundle()</code></a>: +Called <em>once per bundle of elements</em> before calling <code class="highlighter-rouge">process</code> on the first element of the bundle. +This is a good place to start keeping track of the bundle elements.</p> + </li> + <li> + <p><a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn.process"><strong><code class="highlighter-rouge">DoFn.process(element, *args, **kwargs)</code></strong></a>: +Called <em>once per element</em>, can <em>yield zero or more elements</em>. +Additional <code class="highlighter-rouge">*args</code> or <code class="highlighter-rouge">**kwargs</code> can be passed through +<a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.ParDo"><code class="highlighter-rouge">beam.ParDo()</code></a>. +<strong>[required]</strong></p> + </li> + <li> + <p><a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn.finish_bundle"><code class="highlighter-rouge">DoFn.finish_bundle()</code></a>: +Called <em>once per bundle of elements</em> after calling <code class="highlighter-rouge">process</code> after the last element of the bundle, +can <em>yield zero or more elements</em>. This is a good place to do batch calls on a bundle of elements, +such as running a database query.</p> + + <p>For example, you can initialize a batch in <code class="highlighter-rouge">start_bundle</code>, +add elements to the batch in <code class="highlighter-rouge">process</code> instead of yielding them, +then running a batch query on those elements on <code class="highlighter-rouge">finish_bundle</code>, and yielding all the results.</p> + + <p>Note that yielded elements from <code class="highlighter-rouge">finish_bundle</code> must be of the type +<a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/utils/windowed_value.py"><code class="highlighter-rouge">apache_beam.utils.windowed_value.WindowedValue</code></a>. +You need to provide a timestamp as a unix timestamp, which you can get from the last processed element. +You also need to provide a window, which you can get from the last processed element like in the example below.</p> + </li> + <li> + <p><a href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.DoFn.teardown"><code class="highlighter-rouge">DoFn.teardown()</code></a>: +Called <em>once (as a best effort) per <code class="highlighter-rouge">DoFn</code> instance</em> when the <code class="highlighter-rouge">DoFn</code> instance is shutting down. +This is a good place to close database instances, close network connections or other resources.</p> + + <p>Note that <code class="highlighter-rouge">teardown</code> is called as a <em>best effort</em> and is <em>not guaranteed</em>. +For example, if the worker crashes, <code class="highlighter-rouge">teardown</code> might not be called.</p> + </li> +</ul> + +<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">DoFnMethods</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="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="s">'__init__'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="n">beam</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">GlobalWindow</span><span class="p">()</span> + + <span class="k">def</span> <span class="nf">setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="s">'setup'</span><span class="p">)</span> + + <span class="k">def</span> <span class="nf">start_bundle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="s">'start_bundle'</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">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="bp">self</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="n">window</span> + <span class="k">yield</span> <span class="s">'* process: '</span> <span class="o">+</span> <span class="n">element</span> + + <span class="k">def</span> <span class="nf">finish_bundle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">yield</span> <span class="n">beam</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">windowed_value</span><span class="o">.</span><span class="n">WindowedValue</span><span class="p">(</span> + <span class="n">value</span><span class="o">=</span><span class="s">'* finish_bundle: 🌱🌳🌍'</span><span class="p">,</span> + <span class="n">timestamp</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> + <span class="n">windows</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="p">],</span> + <span class="p">)</span> + + <span class="k">def</span> <span class="nf">teardown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="s">'teardown'</span><span class="p">)</span> + +<span class="k">with</span> <span class="n">beam</span><span class="o">.</span><span class="n">Pipeline</span><span class="p">()</span> <span class="k">as</span> <span class="n">pipeline</span><span class="p">:</span> + <span class="n">results</span> <span class="o">=</span> <span class="p">(</span> + <span class="n">pipeline</span> + <span class="o">|</span> <span class="s">'Create inputs'</span> <span class="o">>></span> <span class="n">beam</span><span class="o">.</span><span class="n">Create</span><span class="p">([</span><span class="s">'🍓'</span><span class="p">,</span> <span class="s">'🥕'</span><span class="p">,</span> <span class="s">'🍆'</span><span class="p">,</span> <span class="s">'🍅'</span><span class="p">,</span> <span class="s">'🥔'</span><span class="p">])</span> + <span class="o">|</span> <span class="s">'DoFn methods'</span> <span class="o">>></span> <span class="n">beam</span><span class="o">.</span><span class="n">ParDo</span><span class="p">(</span><span class="n">DoFnMethods</span><span class="p">())</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="k">print</span><span class="p">)</span> + <span class="p">)</span> +</code></pre> +</div> + +<p><code class="highlighter-rouge">stdout</code> output:</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>__init__ +setup +start_bundle +* process: 🍓 +* process: 🥕 +* process: 🍆 +* process: 🍅 +* process: 🥔 +* finish_bundle: 🌱🌳🌍 +teardown +</code></pre> +</div> + +<table> + <td> + <a class="button" target="_blank" href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/snippets/transforms/element_wise/pardo.py"> + <img src="https://www.tensorflow.org/images/GitHub-Mark-32px.png" width="20px" height="20px" alt="View on GitHub" /> + View on GitHub + </a> + </td> +</table> +<p><br /></p> + +<blockquote> + <p><em>Known issues:</em></p> + + <ul> + <li><a href="https://issues.apache.org/jira/browse/BEAM-7885">[BEAM-7885]</a> +<code class="highlighter-rouge">DoFn.setup()</code> doesn’t run for streaming jobs running in the <code class="highlighter-rouge">DirectRunner</code>.</li> + <li><a href="https://issues.apache.org/jira/browse/BEAM-7340">[BEAM-7340]</a> +<code class="highlighter-rouge">DoFn.teardown()</code> metrics are lost.</li> + </ul> +</blockquote> <h2 id="related-transforms">Related transforms</h2> + <ul> - <li><a href="/documentation/transforms/python/elementwise/flatmap">FlatMap</a> behaves the same as <code class="highlighter-rouge">Map</code>, but for each input it may produce zero or more outputs.</li> - <li><a href="/documentation/transforms/python/elementwise/filter">Filter</a> is useful if the function is just + <li><a href="/documentation/transforms/python/elementwise/map">Map</a> behaves the same, but produces exactly one output for each input.</li> + <li><a href="/documentation/transforms/python/elementwise/flatmap">FlatMap</a> behaves the same as <code class="highlighter-rouge">Map</code>, +but for each input it may produce zero or more outputs.</li> + <li><a href="/documentation/transforms/python/elementwise/filter">Filter</a> is useful if the function is just deciding whether to output an element or not.</li> </ul> +<table> + <td> + <a class="button" target="_blank" href="https://beam.apache.org/releases/pydoc/current/apache_beam.transforms.core.html#apache_beam.transforms.core.ParDo"> + <img src="https://beam.apache.org/images/logos/sdks/python.png" width="20px" height="20px" alt="Pydoc" /> + Pydoc + </a> + </td> +</table> +<p><br /></p> + </div> </div> <!--