因此,我正在从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()
无法正常工作的原因。
感谢您的帮助!