将RDD中的所有元素复制到数组

时间:2017-03-16 19:23:38

标签: scala apache-spark apache-spark-sql

因此,我正在从JSON文件中读取数据并创建DataFrame。通常,我会使用

sqlContext.read.json("//line//to//some-file.json")  

问题是我的JSON文件不一致。因此,对于文件中的每一行,有2个JSON。每一行都是这样的

{...data I don't need....}, {...data I need....}  

我只需要根据我需要的数据形成DataFrame,即每行的第二个JSON。所以我把每一行都读成一个字符串并将我需要的部分子串起来,就像这样

val lines = sc.textFile(link, 2)
val part = lines.map( x => x.substring(x.lastIndexOf('{')).trim)

我希望获得' part'中的所有元素。作为Array[String]然后将Array[String]转换为一个字符串并生成DataFrame。像这样

val strings = part .collect() //doesn't work
val strings = part.take(1000) //works
val jsonStr = "[".concat(strings.mkString(", ")).concat("]")

问题是,如果我拨打part.collect(),它就无法正常工作,但如果我致电part.take(N)则可行。但是,我想获取所有数据,而不仅仅是第一个N.

另外,如果我尝试part.take(part.count().toInt),它仍然无效。

任何想法?

编辑

睡了个好觉后,我意识到了自己的问题。我这是一个愚蠢的错误。我的输入文件的最后一行具有与文件其余部分不同的格式。

所以part.take(N)适用于所有N小于part.count()的N.这就是为什么part.collect()无法正常工作的原因。

感谢您的帮助!

0 个答案:

没有答案