将Java RDD写入具有不同架构的多个文件夹

时间:2019-01-03 16:23:22

标签: apache-spark rdd

如果我有一个Spark数据框,则可以在编写时使用DataFrameWriter的partitionBy()方法很容易地将数据分区到多个文件夹中。

但是我的出发点实际上是JavaRDD。同样,使用SparkSession类的静态createDataFrame(JavaRDD rdd,Class clsT)将JavaRDD转换为数据框也很简单。

为此,类clsT必须是bean类型的类。到目前为止,一切都对我有效。

现在,我的bean类具有以下字段以及以下示例值

String partitionFieldOne = "a";
String partitionFieldTwo = "b";
String id = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
String data = "field1: value1, field2: value2, field3: value3, ..."

现在,我遇到的问题如下。 当以这种分区方式进行写入时,所有写入同一文件夹的bean对象在数据字符串中将具有相同的字段(field1a,field2a,field3a等),但是写入另一个文件夹的bean对象将具有不同的集数据字符串中的字段数(field1b,field2b,field3b等)。

这意味着如果能够将这些字段名称包含在架构中,则可以节省大量磁盘空间。目前,所有写入一个文件的数据点(我正在写入镶木地板,但我确定问题在于写入其他格式)都具有相同的字段集,因此数据字符串(字段)对每个数据点重复。

这些字段的名称(它们实际上是表示时间戳的长整数)仅在运行时才知道,并且会随着时间的变化而变化,因此我无法为可能存在的每组字段创建Java Bean类家族。

我想知道的是,是否有可能能够以分区方式编写,同时为每个分区使用不同的架构?

我知道我可以对RDD进行分区(在这一段中,我使用传统意义上的Spark分区一词,在其中我指定RDD中的哪些数据点位于哪些节点中),然后使用forEachPartition JavaRDD的()方法来分别写入每个文件夹中的每个文件,但是我想知道DataFrameWriter是否允许针对不同的写入分区使用不同的模式。

请让我知道我是否对此解释不正确

0 个答案:

没有答案