Second that 'it's responsibility of the transform'. For the case when a
PTransform doesn't have enough information(PTransform developer should have
the knowledge), I would prefer a strict way so users won't forget to call
withSomethingCoder(), like
- a Coder is required to new the PTransform;
- or an interface 'getOutputCoder' to be implemented;

On Wed, Jul 26, 2017 at 11:21 AM, Eugene Kirpichov <
kirpic...@google.com.invalid> wrote:

> Hm, can you elaborate? I'm not sure how this relates to my suggestion, the
> gist of which is "PTransform's should set the coder on all of their
> outputs, and the user should never have to .setCoder() on a PCollection
> obtained from a PTransform"
>
> On Wed, Jul 26, 2017 at 7:38 AM Lukasz Cwik <lc...@google.com.invalid>
> wrote:
>
> > I'm split between our current one pass model of pipeline construction
> and a
> > two pass model where all information is gathered and then PTransform
> > expansions are performed.
> >
> >
> > On Tue, Jul 25, 2017 at 8:25 PM, Eugene Kirpichov <
> > kirpic...@google.com.invalid> wrote:
> >
> > > Hello,
> > >
> > > I've worked on a few different things recently and ran repeatedly into
> > the
> > > same issue: that we do not have clear guidance on who should set the
> > Coder
> > > on a PCollection: is it responsibility of the PTransform that outputs
> it,
> > > or is it responsibility of the user, or is it sometimes one and
> sometimes
> > > the other?
> > >
> > > I believe that the answer is "it's responsibility of the transform" and
> > > moreover that  ideally PCollection.setCoder() should not exist.
> Instead:
> > >
> > > - Require that all transforms set a Coder on the PCollection's they
> > produce
> > > - i.e. it should never be responsibility of the user to "fix up" a
> coder
> > on
> > > a PCollection produced by a transform.
> > >
> > > - Since all transforms are composed of primitive transforms, saying
> > > "transforms must set a Coder" means simply that all *primitive*
> > transforms
> > > must set a Coder on their output.
> > >
> > > - In some cases, a primitive PTransform currently doesn't have enough
> > > information to infer a coder for its output collection - e.g.
> > > ParDo.of(DoFn<InputT, OutputT>) might be unable to infer a coder for
> > > OutputT. In that case such transforms should allow the user to provide
> a
> > > coder: ParDo.of(DoFn).withOutputCoder(...) [note that this differs
> from
> > > requiring the user to set a coder on the resulting collection]
> > >
> > > - Corollary: composite transforms need to only configure their
> primitive
> > > transforms (and composite sub-transforms) properly, and give them a
> Coder
> > > if needed.
> > >
> > > - Corollary: a PTransform with type parameters <FooT, BarT, ...> needs
> to
> > > be configurable with coders for all of these, because the
> implementation
> > of
> > > the transform may change and it may introduce intermediate collections
> > > involving these types. However, in many cases, some of these type
> > > parameters appear in the type of the transform's input, e.g. a
> > > PTransform<PCollection<KV<FooT, BarT>>, PCollection<MooT>> will
> always be
> > > able to extract the coders for FooT and BarT from the input
> PCollection,
> > so
> > > the user does not need to provide them. However, a coder for BarT must
> be
> > > provided. I think in most cases the transform needs to be configurable
> > only
> > > with coders for its output.
> > >
> > > Here's a smooth migration path to accomplish the above:
> > > - Make PCollection.createPrimitiveOutputInternal() take a Coder.
> > > - Make all primitive transforms optionally configurable with a coder
> for
> > > their outputs, such as ParDo.of(DoFn).withOutputCoder().
> > > - By using the above, make all composite transforms shipped with the
> SDK
> > > set a Coder on the collections they produce; in some cases, this will
> > > require adding a withSomethingCoder() option to the transform and
> > > propagating that coder to its sub-transforms. If the option is unset,
> > > that's fine for now.
> > > - As a result of the above, get rid of all setCoder() calls in the Beam
> > > repo. The call will still be there, but it will just not be used
> anywhere
> > > in the SDK or examples, and we can mark it deprecated.
> > > - Add guidance to PTransform Style Guide in line with the above
> > >
> > > Does this sound like a good idea? I'm not sure how urgent it would be
> to
> > > actually do this, but I'd like to know whether people agree that this
> is
> > a
> > > good goal in general.
> > >
> >
>



-- 
----
Mingmin

Reply via email to