用avro序列化rdd

x3naxklr  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(395)

我有这个场景。我们必须提供一个功能,采取任何类型的 RDD ,你可以说 RDD[T] 并使用 Avro DataFile .
注意rdd可以是任何类型的,因此功能应该是给定rdd类型的通用功能,例如, RDD[(String, AnyBusinessObject)] o RDD[(String, Date, OtherBusinessObject)] .
问题是:我们如何推断avro模式并为任何类类型提供avro序列化,以便将其保存为avro数据文件?
这个功能实际上已经构建好了,但是它使用java序列化,这显然会导致空间和时间的损失,所以我们想重构它。我们不能使用Dataframe。

oug3syen

oug3syen1#

您可以使用GenericRecordAPI编写avro文件(请参阅“序列化和反序列化而不生成代码”部分)。但是,您仍然需要有avro模式。
如果您有一个Dataframe,spark将为您处理所有这些,因为spark知道如何从sparksql类型转换为avro类型。
既然您说您不能使用Dataframe,那么您就必须自己生成这个模式。一种选择是使用avro的reflectdataapi。
然后,一旦你有了这个模式,你就要做一个 map 将rdd中的所有元素转换为 GenericRecord 选择和使用 GenericDatumWriter 将其写入文件。
不过,我会认真重新考虑这些要求。在我看来,更好的设计是将rdd转换成Dataframe,这样就可以让spark完成编写avro的繁重工作。或者。。。为什么还要和阿芙罗在一起?只需使用一种文件格式,它允许您拥有像json这样的通用模式。

相关问题