【问题标题】:serialize RDD with Avro使用 Avro 序列化 RDD
【发布时间】:2023-03-11 10:35:02
【问题描述】:

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

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

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

这个功能其实已经构建好了,但是它使用了Java序列化,这显然会造成空间和时间的损失,所以我们想对其进行重构。我们不能使用 DataFrame。

【问题讨论】:

    标签: apache-spark hadoop serialization avro


    【解决方案1】:

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

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

    既然你说你不能使用 DataFrames,你必须自己做这个模式生成。一种选择是使用 Avro 的ReflectData API

    然后,一旦您有了架构,您将执行 map 将 RDD 中的所有元素转换为 GenericRecords 并使用 GenericDatumWriter 将其写入文件。

    不过,我会认真重新考虑这些要求。 IMO,更好的设计是将 RDD 转换为 DataFrame,这样您就可以让 Spark 完成编写 Avro 的繁重工作。或者......为什么还要打扰 Avro?只需使用允许您拥有像 JSON 这样的通用架构的文件格式。

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多