使用spark.api.python.Converter将Spark RDD保存到Avro

时间:2015-02-06 15:06:27

标签: python scala apache-spark avro

我正在尝试按照Spark 1.1: Bringing Hadoop Input/Output Formats to PySpark指南以Avro格式保留RDD。我的转换器工作,但看起来很丑。

class JavaToAvroWrapperConverter()
  extends Converter[Any, AvroKey[GenericData.Record]] {
  override def convert(obj: Any): AvroKey[GenericData.Record] = {
    val args: Array[Any] = obj.asInstanceOf[Array[Any]]
    val schema = (new Parser).parse(args(1).asInstanceOf[String])
    val map = args(0).asInstanceOf[Array[Any]](0).asInstanceOf[util.HashMap[String, Any]]
    val record = new GenericData.Record(schema)
    map.keys.foreach(k => record.put(k, map(k)))

    new AvroKey[GenericData.Record](record)
  }
}

要实现这一点,我需要将我的RDD构建为每行到模式的映射

to_avro_rdd.map(lambda x: ((x, avroSchema), None)).saveAsNewAPIHadoopFile(
        path + ".out",
        keyClass = "org.apache.avro.mapred.AvroKey",
        valueClass = "org.apache.hadoop.io.NullWritable",
        outputFormatClass = "org.apache.avro.mapreduce.AvroKeyOutputFormat",
        keyConverter="org.apache.spark.examples.pythonconverters.JavaToAvroWrapperConverter",
        conf=conf
    )

所以,我的问题是,是否有更文明的方法来处理它,而不是在每个RDD元组中重复模式,而不是在转换器中以一个庞大的参数形式获取它。或者同一个问题的简短版本是:我做错了什么?

谢谢!

0 个答案:

没有答案