将BSON转换为JSON以删除ObjectId

时间:2017-11-23 12:36:08

标签: json scala apache-spark

我正在使用从使用mongodb的应用程序生成的BSON数据集,现在我希望能够使用Spark对其执行某些计算,但因为它只在BSON中有一些属性,它是JSON,它包含一些无效的表达式,如ObjectId和ISODate。我希望能够删除那些例如从:

"_id" : ObjectId("589895e123c572923e69f5e7"),

"_id" : "589895e123c572923e69f5e7",

我做了类似的事情:

val rawText = spark.sparkContext.wholeTextFiles(path)
val rawString = rawText.take(1)(0)._2
val newText = rawString.replaceAll("""ObjectId\(([^)]+)\)""", "'$1'")
val newTextRDD = spark.sparkContext.parallelize(newText)
newTextRDD.saveAsTextFile("newSample")

这在逻辑上有效,但问题是结果文本文件在一行中保存为单个字符。

{

"

_

i

d

"

:

'

"

5

8

9

8

9

5

e

1

2

3

c

5

7

2

9

2

3

e

6

9

f

5

e

7

"

'

,

我怎样才能优雅地实现这一目标?

1 个答案:

答案 0 :(得分:1)

不要rawText.take(1)(0)._2parallelize

相反:

rawText
  .values  // Drop file name
  // Replace
  .map(_.replaceAll("""ObjectId\(([^)]+)\)""", "'$1'"))
  // Save directly without collecting
  .saveAsTextFile("newSample")