在hadoopFile上收集RDD返回重复的结果

时间:2017-03-10 06:17:17

标签: scala apache-spark

我正在尝试阅读下面的avro文件

val rdd = sc.hadoopFile(
  classOf[org.apache.avro.mapred.AvroInputFormat[MyAvroRecord]],
  classOf[org.apache.avro.mapred.AvroWrapper[MyAvroRecord]],
  classOf[org.apache.hadoop.io.NullWritable])(avropath)


val collectedData = rdd.collect()

for (s <- collectedData){
  println(s)
}

然而,当我打印相同时它会给出重复的值。有没有办法从RDD获取有效值。

1 个答案:

答案 0 :(得分:2)

在执行收集之前添加rdd.map(_._1.datum)

来自SparkContext API docs

  

&#39;&#39;&#39;注意:&#39;&#39;&#39;因为Hadoop的RecordReader类为每条记录重复使用相同的Writable对象,所以直接缓存返回的RDD或直接将其传递给聚合或shuffle操作将创建对同一对象的许多引用。如果您计划直接缓存,排序或聚合Hadoop可写对象,则应首先使用map函数复制它们。