我在使用Apache Flink编写程序时遇到困难。问题是我试图通过计算生成Hadoop's MapFile,但Scala编译器抱怨类型不匹配。
为了说明问题,让我向您展示下面的代码片段,它尝试生成两种输出:一种是Hadoop's SequenceFile,另一种是MapFile。
val dataSet: DataSet[(IntWritable, BytesWritable)] =
env.readSequenceFile(classOf[Text], classOf[BytesWritable], inputSequenceFile.toString)
.map(mapper(_))
.partitionCustom(partitioner, 0)
.sortPartition(0, Order.ASCENDING)
val seqOF = new HadoopOutputFormat(
new SequenceFileOutputFormat[IntWritable, BytesWritable](), Job.getInstance(hadoopConf)
)
val mapfileOF = new HadoopOutputFormat(
new MapFileOutputFormat(), Job.getInstance(hadoopConf)
)
val dataSink1 = dataSet.output(seqOF) // it typechecks!
val dataSink2 = dataSet.output(mapfileOF) // syntax error
如上所述,dataSet.output(mapfileOF)会导致Scala编译器抱怨如下: FYI,与SequenceFile相比,MapFile需要一个更强的条件,即一个键必须是WritableComparable。
在使用Flink编写应用程序之前,我使用Spark实现它,如下所示,它工作正常(没有编译错误,运行正常,没有任何错误)。
val rdd = sc
.sequenceFile(inputSequenceFile.toString, classOf[Text], classOf[BytesWritable])
.map(mapper(_))
.repartitionAndSortWithinPartitions(partitioner)
rdd.saveAsNewAPIHadoopFile(
outputPath.toString,
classOf[IntWritable],
classOf[BytesWritable],
classOf[MapFileOutputFormat]
)
答案 0 :(得分:0)
它包含以下示例:
// Obtain your result to emit.
val hadoopResult: DataSet[(Text, IntWritable)] = [...]
val hadoopOF = new HadoopOutputFormat[Text,IntWritable](
new TextOutputFormat[Text, IntWritable],
new JobConf)
hadoopOF.getJobConf.set("mapred.textoutputformat.separator", " ")
FileOutputFormat.setOutputPath(hadoopOF.getJobConf, new Path(resultPath))
hadoopResult.output(hadoopOF)