DoFn process return type
My understanding is that you want to return an iterable. So if you return a dictionary, the output will really be the list of its keys. I stick with only using yield for simplicity.
In Beam 2.3.0, the DoFn process API needed to return a generator through yield while in Beam 2.4.0, returning an object like dictionary from the process API works fine. 
Is there a change in programming model from 2.3.0 to 2.4.0 ? For large scale Google Cloud Dataflow processing, is yield (generator) preferred over returning objects (list, dict) from the DoFn process API ?