我有一个如下类型的JavaPairRDD:
Tuple2<String, Iterable<Tuple2<String, Iterable<Tuple2<String, String>>>>>
表示以下对象:
(Table_name, Iterable(Tuple_ID, Iterable(Column_name, Column_value)))
这意味着RDD中的每条记录将创建一个Parquet文件。
正如您可能已经猜到的那样,这个想法是将每个对象保存为一个名为Table_name的新Parquet表。在这个表中,有一个名为ID的列存储值Tuple_ID,每个列Column_name存储值Column_value。我面临的挑战是表的列(模式)是在运行时动态收集的,而且,由于不可能在Spark中创建嵌套的RDD,我不能在以前的RDD中创建RDD(为每条记录)并最终将其保存到Parquet文件中——当然是在将其转换为DataFrame之后。
我不能仅仅将以前的RDD转换为DataFrame,原因很明显(需要迭代以获得列/值)。
作为临时的解决方案,我使用collect()
将RDD平方化为与RDD相同类型的列表,但这不是正确的方法,因为数据可能大于驱动程序机器上的可用磁盘空间,从而导致内存不足。
对如何实现这一点有什么建议吗?如果问题还不够清楚,请告诉我。
看看这个[问题]的答案[1]
[1]:将RDD分区写入自己目录下的单个parquet文件。我使用这个答案为每个分区创建单独的(一个或多个)parquet文件。如果您愿意,我相信您可以使用相同的技术来创建具有不同模式的单独文件。