如何修改RDD映射转换中的avro键/值模式

时间:2016-01-05 14:34:10

标签: dictionary apache-spark schema rdd avro

我正在尝试将一些Hadoop Map Reduce代码迁移到Spark,并且当键或值的架构从输入更改为输出时,我对如何管理映射和减少转换有疑问。

我有带有指标记录的avro文件,我想以某种方式处理。我已经有了这个有效的代码:

val myAvroJob = new Job()            
myAvroJob.setInputFormatClass(classOf[AvroKeyInputFormat[Indicator]])    
myAvroJob.setOutputFormatClass(classOf[AvroKeyOutputFormat[Indicator]])       
myAvroJob.setOutputValueClass(classOf[NullWritable])

AvroJob.setInputValueSchema(myAvroJob, Schema.create(Schema.Type.NULL))
AvroJob.setInputKeySchema(myAvroJob,  Indicator.SCHEMA$)
AvroJob.setOutputKeySchema(myAvroJob, Indicator.SCHEMA$)    

val indicatorsRdd = sc.newAPIHadoopRDD(myAvroJob.getConfiguration,
  classOf[AvroKeyInputFormat[Indicator]],
  classOf[AvroKey[Indicator]],
  classOf[NullWritable]) 

val myRecordOnlyRdd = indicatorsRdd.map(x => (doSomethingWith(x._1), NullWritable.get)

val indicatorPairRDD = new PairRDDFunctions(myRecordOnlyRdd)
indicatorPairRDD.saveAsNewAPIHadoopDataset(myAvroJob.getConfiguration)

但是这段代码有效,因为输入和输出键的模式不会改变,总是指示符。在hadoop Map Reduce中,您可以定义映射或减少函数,并从输入到输出修改模式。实际上,我有map函数处理每个 Indicator 记录并生成一条新记录 SoporteCartera 。我怎么能在火花中做到这一点?有可能从同一个RDD或我必须定义2个不同的RDD并以某种方式从一个传递到另一个吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题......问题是你不能改变RDD类型,你必须定义一个不同的RDD,所以我用上面的代码解决了它:

val myAvroJob = new Job()            
myAvroJob.setInputFormatClass(classOf[AvroKeyInputFormat[SoporteCartera]])    
myAvroJob.setOutputFormatClass(classOf[AvroKeyOutputFormat[Indicator]])       
myAvroJob.setOutputValueClass(classOf[NullWritable])

AvroJob.setInputValueSchema(myAvroJob, Schema.create(Schema.Type.NULL))
AvroJob.setInputKeySchema(myAvroJob,  SoporteCartera.SCHEMA$)
AvroJob.setOutputKeySchema(myAvroJob, Indicator.SCHEMA$)

val soporteCarteraRdd = sc.newAPIHadoopRDD(myAvroJob.getConfiguration,
  classOf[AvroKeyInputFormat[SoporteCartera]],
  classOf[AvroKey[SoporteCartera]],
  classOf[NullWritable])          

val indicatorsRdd = soporteCarteraRdd.map(x => (fromSoporteCarteraToIndicator(x._1), NullWritable.get))

val indicatorPairRDD = new PairRDDFunctions(indicatorsRdd)
indicatorPairRDD.saveAsNewAPIHadoopDataset(myAvroJob.getConfiguration)