我有这个场景。我们必须提供一个功能,采取任何类型的 RDD
,你可以说 RDD[T]
并使用 Avro DataFile
.
注意rdd可以是任何类型的,因此功能应该是给定rdd类型的通用功能,例如, RDD[(String, AnyBusinessObject)]
o RDD[(String, Date, OtherBusinessObject)]
.
问题是:我们如何推断avro模式并为任何类类型提供avro序列化,以便将其保存为avro数据文件?
这个功能实际上已经构建好了,但是它使用java序列化,这显然会导致空间和时间的损失,所以我们想重构它。我们不能使用Dataframe。
1条答案
按热度按时间oug3syen1#
您可以使用GenericRecordAPI编写avro文件(请参阅“序列化和反序列化而不生成代码”部分)。但是,您仍然需要有avro模式。
如果您有一个Dataframe,spark将为您处理所有这些,因为spark知道如何从sparksql类型转换为avro类型。
既然您说您不能使用Dataframe,那么您就必须自己生成这个模式。一种选择是使用avro的reflectdataapi。
然后,一旦你有了这个模式,你就要做一个
map
将rdd中的所有元素转换为GenericRecord
选择和使用GenericDatumWriter
将其写入文件。不过,我会认真重新考虑这些要求。在我看来,更好的设计是将rdd转换成Dataframe,这样就可以让spark完成编写avro的繁重工作。或者。。。为什么还要和阿芙罗在一起?只需使用一种文件格式,它允许您拥有像json这样的通用模式。