/ / Converta BSON para JSON para remover ObjectId - json, scala, apache-spark

Converter BSON para JSON para remover ObjectId - json, scala, apache-spark

Estou trabalhando com um conjunto de dados BSON com eragerado a partir de um aplicativo que estava usando mongodb, agora eu quero ser capaz de realizar alguns cálculos nele usando Spark, mas porque ele tem alguns atributos apenas em um BSON que é uma extensão de JSON e inclui algumas expressões inválidas como ObjectId e ISODate. Eu quero ser capaz de remover aqueles, por exemplo, a partir de:

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

para

"_id" : "589895e123c572923e69f5e7",.

Eu fiz algo assim:

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")

Isso funciona logicamente, mas o problema é que o arquivo de texto resultante é salvo como um único caractere em uma única linha.

{

"

_

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

"

"

,

Como posso fazer isso com elegância?

Respostas:

1 para resposta № 1

Não "t rawText.take(1)(0)._2 e parallelize

Em vez de:

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