我正在使用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/

10-12 23:01