Would it be right to assume that the silence on this topic implies others don't really have this issue/desire?
On Sat, 18 Jul 2015 at 17:24 Silas Davis <si...@silasdavis.net> wrote: > *tl;dr hadoop and cascading* *provide ways of writing tuples to multiple > output files based on key, but the plain RDD interface doesn't seem to and > it should.* > > I have been looking into ways to write to multiple outputs in Spark. It > seems like a feature that is somewhat missing from Spark. > > The idea is to partition output and write the elements of an RDD to > different locations depending based on the key. For example in a pair RDD > your key may be (language, date, userId) and you would like to write > separate files to $someBasePath/$language/$date. Then there would be a > version of saveAsHadoopDataset that would be able to multiple location > based on key using the underlying OutputFormat. Perahps it would take a > pair RDD with keys ($partitionKey, $realKey), so for example ((language, > date), userId). > > The prior art I have found on this is the following. > > Using SparkSQL: > The 'partitionBy' method of DataFrameWriter: > https://spark.apache.org/docs/1.4.0/api/scala/index.html#org.apache.spark.sql.DataFrameWriter > > This only works for parquet at the moment. > > Using Spark/Hadoop: > This pull request (with the hadoop1 API,) : > https://github.com/apache/spark/pull/4895/files. > > This uses MultipleTextOutputFormat (which in turn uses > MultipleOutputFormat) which is part of the old hadoop1 API. It only works > for text but could be generalised for any underlying OutputFormat by using > MultipleOutputFormat (but only for hadoop1 - which doesn't support > ParquetAvroOutputFormat for example) > > This gist (With the hadoop2 API): > https://gist.github.com/mlehman/df9546f6be2e362bbad2 > > This uses MultipleOutputs (available for both the old and new hadoop APIs) > and extends saveAsNewHadoopDataset to support multiple outputs. Should work > for any underlying OutputFormat. Probably better implemented by extending > saveAs[NewAPI]HadoopDataset. > > In Cascading: > Cascading provides PartititionTap: > http://docs.cascading.org/cascading/2.5/javadoc/cascading/tap/local/PartitionTap.html > to do this > > So my questions are: is there a reason why Spark doesn't provide this? > Does Spark provide similar functionality through some other mechanism? How > would it be best implemented? > > Since I started composing this message I've had a go at writing an wrapper > OutputFormat that writes multiple outputs using hadoop MultipleOutputs but > doesn't require modification of the PairRDDFunctions. The principle is > similar however. Again it feels slightly hacky to use dummy fields for the > ReduceContextImpl, but some of this may be a part of the impedance mismatch > between Spark and plain Hadoop... Here is my attempt: > https://gist.github.com/silasdavis/d1d1f1f7ab78249af462 > > I'd like to see this functionality in Spark somehow but invite suggestion > of how best to achieve it. > > Thanks, > Silas >