Spark - 在动态模式

时间:2015-08-12 15:25:38

标签: apache-spark apache-spark-sql parquet

我有以下输入的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 个答案:

答案 0 :(得分:0)

看看这个[问题] [1]

的答案

[1]:Writing RDD partitions to individual parquet files in its own directory。我使用这个答案为每个分区创建单独的(一个或多个)镶木地板文件。我相信这种技术可以使用相同的方法创建单独的文件,如果你愿意,每个文件都有不同的模式。