我正在使用从使用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
"
'
,
我怎样才能优雅地实现这一目标?
答案 0 :(得分:1)
不要rawText.take(1)(0)._2
和parallelize
相反:
rawText
.values // Drop file name
// Replace
.map(_.replaceAll("""ObjectId\(([^)]+)\)""", "'$1'"))
// Save directly without collecting
.saveAsTextFile("newSample")