我正在尝试使用newAPIHadoopFile
从磁盘读取100个不同的Avro记录,但在收集后我最终得到一个包含重复100次的最终记录的列表。
我注意到提到的API文档首先映射数据,但没有区别:
注意:因为Hadoop的RecordReader类重用了相同的内容 每条记录的可写对象,直接缓存返回的 RDD将创建对同一对象的许多引用。如果你有计划 要直接缓存Hadoop可写对象,首先应该复制它们 使用
map
函数。
示例代码:
JavaPairRDD<AvroKey, NullWritable> testRDD = sc.newAPIHadoopFile(dataSource.getFileDir(), AvroKeyInputFormat.class, AvroKey.class, NullWritable.class, new Configuration());
List<Object> collect = testRDD.map(a -> a._1.datum()).collect();
但是,使用以下内容似乎按预期打印出记录:
JavaPairRDD<AvroKey, NullWritable> testRDD = sc.newAPIHadoopFile(dataSource.getFileDir(), AvroKeyInputFormat.class, AvroKey.class, NullWritable.class, new Configuration());
testRDD.foreach(a -> System.out.println(a._1.datum().toString()));
我正在使用Spark 1.6。
Spark Context初始化为:
SparkConf conf = new SparkConf()
.setMaster("local")
.setAppName("TestApp")
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
sc = new JavaSparkContext(conf);