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