我正在尝试按照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元组中重复模式,而不是在转换器中以一个庞大的参数形式获取它。或者同一个问题的简短版本是:我做错了什么?
谢谢!