我正在使用https://github.com/alexholmes/json-mapreduce中的代码将多行json文件读入RDD。
var data = sc.newAPIHadoopFile(
filepath,
classOf[MultiLineJsonInputFormat],
classOf[LongWritable],
classOf[Text],
conf)
我打印出前n个元素以检查其是否正常工作。
data.take(n).foreach { p =>
val (line, json) = p
println
println(new JSONObject(json.toString).toString(4))
}
但是,当我尝试查看数据时,从
take
返回的数组似乎不正确。而不是返回形式的数组
[ data[0], data[1], ... data[n] ]
它的形式
[ data[n], data[n], ... data[n] ]
这是我创建的RDD的问题,还是我尝试打印它的方式的问题?
最佳答案
我想出了为什么take
返回带有重复值的数组。
如API所述:
因此,在我的情况下,它正在重用相同的LongWritable和Text对象。例如,如果我这样做了:
val foo = data.take(5)
foo.map( r => System.identityHashCode(r._1) )
输出为:
Array[Int] = Array(1805824193, 1805824193, 1805824193, 1805824193, 1805824193)
因此,为了防止它这样做,我只是将重用的对象映射到它们各自的值:
val data = sc.newAPIHadoopFile(
filepath,
classOf[MultiLineJsonInputFormat],
classOf[LongWritable],
classOf[Text],
conf ).map(p => (p._1.get, p._2.toString))
关于json - spark.RDD take(n)返回元素n的数组,n次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25310985/