用Avro序列化RDD

时间:2019-03-08 13:16:54

标签: apache-spark hadoop serialization avro

我有这种情况。我们必须提供一种功能,该功能可以使用任何类型的RDD,并带有泛型符号,您可以说RDD[T]并使用Avro DataFile序列化并保存到HDFS。

请注意,RDD可以是任何东西,因此功能应为给定的RDD类型通用,例如RDD[(String, AnyBusinessObject)]RDD[(String, Date, OtherBusinessObject)]

问题是:我们如何推断 Avro模式并为任何类类型提供 Avro序列化,以便将其保存为Avro数据文件?

该功能实际上已经构建,但是它使用了 Java序列化,这显然会造成空间和时间上的损失,因此我们希望对其进行重构。我们不能使用DataFrames。

1 个答案:

答案 0 :(得分:0)

您可以使用GenericRecord API编写avro文件(请参见“不进行代码生成的序列化和反序列化”部分)。但是,您仍然需要Avro模式。

如果您有DataFrame,Spark会为您处理所有这些,因为Spark知道如何进行从Spark SQL类型到Avro类型的转换。

由于您说您不能使用DataFrame,因此您必须自己完成此架构的生成。一种选择是使用Avro的ReflectData API

然后,一旦有了模式,您将执行map将RDD中的所有元素转换为GenericRecord,然后使用GenericDatumWriter将其写入文件。 / p>

我会认真考虑这些要求。 IMO,一种更好的设计是将RDD转换为DataFrame,以便您可以让Spark来完成编写Avro的繁重工作。或者...为什么还要打扰Avro?只需使用一种允许您拥有通用模式(如JSON)的文件格式即可。

相关问题