Apache spark 用Avro序列化RDD

Apache spark 用Avro序列化RDD,apache-spark,hadoop,serialization,avro,Apache Spark,Hadoop,Serialization,Avro,我有这种情况。我们必须提供一种功能,它采用任何类型的RDD,带有泛型符号,您可以说RDD[T],并使用Avro数据文件序列化并保存到HDFS 请注意,RDD可以是任何类型的,因此该功能应该是给定RDD类型的通用功能,例如RDD[String,AnyBusinessObject]o RDD[String,Date,OtherBusinessObject] 问题是:我们如何推断Avro模式并为任何类类型提供Avro序列化,以便将其保存为Avro数据文件 该功能实际上已经构建,但它使用Java序列化,

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

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

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


该功能实际上已经构建,但它使用Java序列化,这显然会导致空间和时间损失,因此我们希望对其进行重构。我们不能使用数据帧。

您可以使用编写avro文件,请参阅“无代码生成的序列化和反序列化”部分。但是,您仍然需要有Avro模式

如果您有一个数据帧,Spark会为您处理所有这些,因为Spark知道如何从Spark SQL类型转换为Avro类型

既然您说您不能使用数据帧,那么您必须自己生成这个模式。一种选择是使用Avro的

然后,一旦您有了这个模式,您将进行映射,将RDD中的所有元素转换为GenericRecords,并使用GenericDatumWriter将其写入文件

不过,我会认真重新考虑这些要求。在我看来,更好的设计是将RDD转换为数据帧,这样就可以让Spark完成编写Avro的繁重工作。或为什么还要麻烦阿夫罗?只需使用一种文件格式,它允许您拥有类似JSON的通用模式