我有以下输入的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相同类型的列表,但这不是正确的方法,因为数据可能大于驱动程序上的可用磁盘空间机器,导致内存不足。
有关如何实现这一目标的任何建议?如果问题不够明确,请告诉我。
答案 0 :(得分:0)
看看这个[问题] [1]
的答案[1]:Writing RDD partitions to individual parquet files in its own directory。我使用这个答案为每个分区创建单独的(一个或多个)镶木地板文件。我相信这种技术可以使用相同的方法创建单独的文件,如果你愿意,每个文件都有不同的模式。