提问者:小点点

Spark-在动态模式的情况下将数据保存到Parquet文件


我有一个以下类型的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]

[1]:将RDD分区写入自己目录中的单个parket文件。我使用这个答案为每个分区创建单独的(一个或多个)parket文件。如果你愿意,我相信你可以使用相同的技术来创建具有不同模式的单独文件。