blob: 9da7ec9c89a329cc5da9b3317ea34fb0aff6f48d [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>FillGaps (Apache Beam 2.47.0)</title>
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="FillGaps (Apache Beam 2.47.0)";
}
}
catch(err) {
}
//-->
var methods = {"i0":10,"i1":9,"i2":9,"i3":9,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.FillGapsDoFn.html" title="class in org.apache.beam.sdk.extensions.timeseries"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../index.html?org/apache/beam/sdk/extensions/timeseries/FillGaps.html" target="_top">Frames</a></li>
<li><a href="FillGaps.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li><a href="#fields.inherited.from.class.org.apache.beam.sdk.transforms.PTransform">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">org.apache.beam.sdk.extensions.timeseries</div>
<h2 title="Class FillGaps" class="title">Class FillGaps&lt;ValueT&gt;</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li><a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html" title="class in org.apache.beam.sdk.transforms">org.apache.beam.sdk.transforms.PTransform</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;ValueT&gt;&gt;</li>
<li>
<ul class="inheritance">
<li>org.apache.beam.sdk.extensions.timeseries.FillGaps&lt;ValueT&gt;</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Implemented Interfaces:</dt>
<dd>java.io.Serializable, <a href="../../../../../../org/apache/beam/sdk/transforms/display/HasDisplayData.html" title="interface in org.apache.beam.sdk.transforms.display">HasDisplayData</a></dd>
</dl>
<hr>
<br>
<pre>public abstract class <span class="typeNameLabel">FillGaps&lt;ValueT&gt;</span>
extends <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html" title="class in org.apache.beam.sdk.transforms">PTransform</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;ValueT&gt;&gt;</pre>
<div class="block">Fill gaps in timeseries. Values are expected to have Beam schemas registered.
<p>This transform views the original PCollection as a collection of timeseries, each with a different key. They
key to be used and the timeseries bucket size are both specified in the <a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#of-org.joda.time.Duration-java.lang.String...-"><code>of(org.joda.time.Duration, java.lang.String...)</code></a> creation method. Multiple
fields can be specified for the key - the key extracted will be a composite of all of them. Any elements in the
original <a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values"><code>PCollection</code></a> will appear unchanged in the output PCollection, with timestamp and window unchanged.
Any gaps in timeseries (i.e. buckets with no elements) will be filled in the output PCollection with a single element
(by default the latest element seen or propagated into the previous bucket). The timestamp of the filled element is
the end of the bucket, and the original PCollection's window function is used to assign it to a window.
<p>Example usage: the following code views each user,country pair in the input <a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values"><code>PCollection</code></a> as a timeseries
with bucket size one second. If any of these timeseries has a bucket with no elements, then the latest element from
the previous bucket (i.e. the one with the largest timestamp) wil be propagated into the missing bucket. If there
are multiple missing buckets, then they all will be filled up to 1 hour - the maximum gap size specified in
<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMaxGapFillBuckets-java.lang.Long-"><code>withMaxGapFillBuckets(java.lang.Long)</code></a>.
<pre><code> PCollection&lt;MyType&gt; input = readInput();
PCollection&lt;MyType&gt; gapFilled =
input.apply("fillGaps",
FillGaps.of(Duration.standardSeconds(1), "userId", "country")
.withMaxGapFillBuckets(3600L)));
gapFilled.apply(MySink.create());
</code></pre>
<p>By default, the latest element from the previous bucket is propagated into missing buckets. The user can override
this using the <a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMergeFunction-org.apache.beam.sdk.transforms.SerializableBiFunction-"><code>withMergeFunction(org.apache.beam.sdk.transforms.SerializableBiFunction&lt;org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;&gt;)</code></a> method. Several built-in merge functions are provided for -
<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#keepLatest--"><code>keepLatest()</code></a> (the default), <a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#keepEarliest--"><code>keepEarliest()</code></a>, an <code>#keepNull()</code>.
<p>Sometimes elements need to be modified before being propagated into a missing bucket. For example, consider the
following element type containing a timestamp:
<pre>{@code @DefaultSchema(JavaFieldSchema.class)
class MyType {
MyData data;
Instant timestamp;</div>
<dl>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../../serialized-form.html#org.apache.beam.sdk.extensions.timeseries.FillGaps">Serialized Form</a></dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="nested.class.summary">
<!-- -->
</a>
<h3>Nested Class Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Class and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static class&nbsp;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.FillGapsDoFn.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps.FillGapsDoFn</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.FillGapsDoFn.html" title="type parameter in FillGaps.FillGapsDoFn">ValueT</a>&gt;</span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>static class&nbsp;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.InterpolateData.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps.InterpolateData</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.InterpolateData.html" title="type parameter in FillGaps.InterpolateData">ValueT</a>&gt;</span></code>
<div class="block">Argument to withInterpolateFunction function.</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- =========== FIELD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="field.summary">
<!-- -->
</a>
<h3>Field Summary</h3>
<ul class="blockList">
<li class="blockList"><a name="fields.inherited.from.class.org.apache.beam.sdk.transforms.PTransform">
<!-- -->
</a>
<h3>Fields inherited from class&nbsp;org.apache.beam.sdk.transforms.<a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html" title="class in org.apache.beam.sdk.transforms">PTransform</a></h3>
<code><a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#name">name</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#resourceHints">resourceHints</a></code></li>
</ul>
</li>
</ul>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#FillGaps--">FillGaps</a></span>()</code>&nbsp;</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code><a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#expand-org.apache.beam.sdk.values.PCollection-">expand</a></span>(<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;input)</code>
<div class="block">Override this method to specify how this <code>PTransform</code> should be expanded on the given
<code>InputT</code>.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>static &lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableBiFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableBiFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#keepEarliest--">keepEarliest</a></span>()</code>
<div class="block">Argument to <a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMergeFunction-org.apache.beam.sdk.transforms.SerializableBiFunction-"><code>withMergeFunction(org.apache.beam.sdk.transforms.SerializableBiFunction&lt;org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;&gt;)</code></a>.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>static &lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableBiFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableBiFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#keepLatest--">keepLatest</a></span>()</code>
<div class="block">Argument to <a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMergeFunction-org.apache.beam.sdk.transforms.SerializableBiFunction-"><code>withMergeFunction(org.apache.beam.sdk.transforms.SerializableBiFunction&lt;org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;&gt;)</code></a>.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>static &lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;ValueT&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#of-org.joda.time.Duration-org.apache.beam.sdk.schemas.FieldAccessDescriptor-">of</a></span>(<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Duration.html?is-external=true" title="class or interface in org.joda.time">Duration</a>&nbsp;windowDuration,
<a href="../../../../../../org/apache/beam/sdk/schemas/FieldAccessDescriptor.html" title="class in org.apache.beam.sdk.schemas">FieldAccessDescriptor</a>&nbsp;keyDescriptor)</code>
<div class="block">Construct the transform for the given duration and key fields.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>static &lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;ValueT&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#of-org.joda.time.Duration-java.lang.String...-">of</a></span>(<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Duration.html?is-external=true" title="class or interface in org.joda.time">Duration</a>&nbsp;windowDuration,
java.lang.String...&nbsp;keys)</code>
<div class="block">Construct the transform for the given duration and key fields.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withInterpolateFunction-org.apache.beam.sdk.transforms.SerializableFunction-">withInterpolateFunction</a></span>(<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.InterpolateData.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps.InterpolateData</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;,<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;interpolateFunction)</code>
<div class="block">This function can be used to modify elements before propagating to the next bucket.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMaxGapFillBuckets-java.lang.Long-">withMaxGapFillBuckets</a></span>(java.lang.Long&nbsp;value)</code>&nbsp;</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMergeFunction-org.apache.beam.sdk.transforms.SerializableBiFunction-">withMergeFunction</a></span>(<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableBiFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableBiFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&gt;&nbsp;mergeFunction)</code>
<div class="block">If there are multiple values in a single timeseries bucket, this function is used to specify
what to propagate to the next bucket.</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withStopTime-org.joda.time.Instant-">withStopTime</a></span>(<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Instant.html?is-external=true" title="class or interface in org.joda.time">Instant</a>&nbsp;stopTime)</code>&nbsp;</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.org.apache.beam.sdk.transforms.PTransform">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;org.apache.beam.sdk.transforms.<a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html" title="class in org.apache.beam.sdk.transforms">PTransform</a></h3>
<code><a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#compose-org.apache.beam.sdk.transforms.SerializableFunction-">compose</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#compose-java.lang.String-org.apache.beam.sdk.transforms.SerializableFunction-">compose</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#getAdditionalInputs--">getAdditionalInputs</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#getDefaultOutputCoder--">getDefaultOutputCoder</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#getDefaultOutputCoder-InputT-">getDefaultOutputCoder</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#getDefaultOutputCoder-InputT-org.apache.beam.sdk.values.PCollection-">getDefaultOutputCoder</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#getKindString--">getKindString</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#getName--">getName</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#getResourceHints--">getResourceHints</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#populateDisplayData-org.apache.beam.sdk.transforms.display.DisplayData.Builder-">populateDisplayData</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#setResourceHints-org.apache.beam.sdk.transforms.resourcehints.ResourceHints-">setResourceHints</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#toString--">toString</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#validate-org.apache.beam.sdk.options.PipelineOptions-">validate</a>, <a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#validate-org.apache.beam.sdk.options.PipelineOptions-java.util.Map-java.util.Map-">validate</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a name="FillGaps--">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>FillGaps</h4>
<pre>public&nbsp;FillGaps()</pre>
</li>
</ul>
</li>
</ul>
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="keepLatest--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>keepLatest</h4>
<pre>public static&nbsp;&lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableBiFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableBiFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;&gt;&nbsp;keepLatest()</pre>
<div class="block">Argument to <a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMergeFunction-org.apache.beam.sdk.transforms.SerializableBiFunction-"><code>withMergeFunction(org.apache.beam.sdk.transforms.SerializableBiFunction&lt;org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;&gt;)</code></a>. Always propagates the element with the latest
timestamp.</div>
</li>
</ul>
<a name="keepEarliest--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>keepEarliest</h4>
<pre>public static&nbsp;&lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableBiFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableBiFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;ValueT&gt;&gt;&nbsp;keepEarliest()</pre>
<div class="block">Argument to <a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html#withMergeFunction-org.apache.beam.sdk.transforms.SerializableBiFunction-"><code>withMergeFunction(org.apache.beam.sdk.transforms.SerializableBiFunction&lt;org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;, org.apache.beam.sdk.values.TimestampedValue&lt;ValueT&gt;&gt;)</code></a>. Always propagates the element with the earliest
timestamp.</div>
</li>
</ul>
<a name="of-org.joda.time.Duration-java.lang.String...-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>of</h4>
<pre>public static&nbsp;&lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;ValueT&gt;&nbsp;of(<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Duration.html?is-external=true" title="class or interface in org.joda.time">Duration</a>&nbsp;windowDuration,
java.lang.String...&nbsp;keys)</pre>
<div class="block">Construct the transform for the given duration and key fields.</div>
</li>
</ul>
<a name="of-org.joda.time.Duration-org.apache.beam.sdk.schemas.FieldAccessDescriptor-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>of</h4>
<pre>public static&nbsp;&lt;ValueT&gt;&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;ValueT&gt;&nbsp;of(<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Duration.html?is-external=true" title="class or interface in org.joda.time">Duration</a>&nbsp;windowDuration,
<a href="../../../../../../org/apache/beam/sdk/schemas/FieldAccessDescriptor.html" title="class in org.apache.beam.sdk.schemas">FieldAccessDescriptor</a>&nbsp;keyDescriptor)</pre>
<div class="block">Construct the transform for the given duration and key fields.</div>
</li>
</ul>
<a name="withMaxGapFillBuckets-java.lang.Long-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>withMaxGapFillBuckets</h4>
<pre>public&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;withMaxGapFillBuckets(java.lang.Long&nbsp;value)</pre>
</li>
</ul>
<a name="withStopTime-org.joda.time.Instant-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>withStopTime</h4>
<pre>public&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;withStopTime(<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Instant.html?is-external=true" title="class or interface in org.joda.time">Instant</a>&nbsp;stopTime)</pre>
</li>
</ul>
<a name="withMergeFunction-org.apache.beam.sdk.transforms.SerializableBiFunction-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>withMergeFunction</h4>
<pre>public&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;withMergeFunction(<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableBiFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableBiFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;,<a href="../../../../../../org/apache/beam/sdk/values/TimestampedValue.html" title="class in org.apache.beam.sdk.values">TimestampedValue</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&gt;&nbsp;mergeFunction)</pre>
<div class="block">If there are multiple values in a single timeseries bucket, this function is used to specify
what to propagate to the next bucket. If not specified, then the value with the latest
timestamp will be propagated.</div>
</li>
</ul>
<a name="withInterpolateFunction-org.apache.beam.sdk.transforms.SerializableFunction-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>withInterpolateFunction</h4>
<pre>public&nbsp;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;withInterpolateFunction(<a href="../../../../../../org/apache/beam/sdk/transforms/SerializableFunction.html" title="interface in org.apache.beam.sdk.transforms">SerializableFunction</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.InterpolateData.html" title="class in org.apache.beam.sdk.extensions.timeseries">FillGaps.InterpolateData</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;,<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;interpolateFunction)</pre>
<div class="block">This function can be used to modify elements before propagating to the next bucket. A common
use case is to modify a contained timestamp to match that of the new bucket.</div>
</li>
</ul>
<a name="expand-org.apache.beam.sdk.values.PCollection-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>expand</h4>
<pre>public&nbsp;<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;expand(<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&nbsp;input)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#expand-InputT-">PTransform</a></code></span></div>
<div class="block">Override this method to specify how this <code>PTransform</code> should be expanded on the given
<code>InputT</code>.
<p>NOTE: This method should not be called directly. Instead apply the <code>PTransform</code> should
be applied to the <code>InputT</code> using the <code>apply</code> method.
<p>Composite transforms, which are defined in terms of other transforms, should return the
output of one of the composed transforms. Non-composite transforms, which do not apply any
transforms internally, should return a new unbound output and register evaluators (via
backend-specific registration methods).</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html#expand-InputT-">expand</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/beam/sdk/transforms/PTransform.html" title="class in org.apache.beam.sdk.transforms">PTransform</a>&lt;<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;,<a href="../../../../../../org/apache/beam/sdk/values/PCollection.html" title="class in org.apache.beam.sdk.values">PCollection</a>&lt;<a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.html" title="type parameter in FillGaps">ValueT</a>&gt;&gt;</code></dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li><a href="../../../../../../org/apache/beam/sdk/extensions/timeseries/FillGaps.FillGapsDoFn.html" title="class in org.apache.beam.sdk.extensions.timeseries"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../index.html?org/apache/beam/sdk/extensions/timeseries/FillGaps.html" target="_top">Frames</a></li>
<li><a href="FillGaps.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li><a href="#fields.inherited.from.class.org.apache.beam.sdk.transforms.PTransform">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>