/ / Scala JSON para DenseMatrix - json, scala, apache-spark, scala-breeze

Scala JSON para DenseMatrix - json, scala, apache-spark, scala-breeze

Estou tentando converter esta resposta JSON:

[
{
"metric":"energy.salted",
"tags":{
"sensor":"0",
"unit":"101"
},
"aggregateTags":[

],
"dps":{
"1477958400":1.9519165754318237,
"1477958401":-0.4030894637107849,
"1477958402":0.6892277598381042,
"1477958403":3.0232467651367188,
"1477958404":0.07003471255302429,
"1477958405":2.305912971496582
}
},
{
"metric":"energy.salted",
"tags":{
"sensor":"1",
"unit":"101"
},
"aggregateTags":[

],
"dps":{
"1477958400":4.979776382446289,
"1477958401":1.8036608695983887,
"1477958402":3.0569913387298584,
"1477958403":0.8318896889686584,
"1477958404":-0.3151852488517761,
"1477958405":2.563884735107422
}
}
]

Em um DenseMatrix dos valores associados às chaves "dps". O DenseMatrix final deve ficar assim:

[
[1.9519165754318237, -0.4030894637107849, 0.6892277598381042, 3.0232467651367188, 0.07003471255302429, 2.305912971496582],
[4.979776382446289, 1.8036608695983887, 3.0569913387298584, 0.8318896889686584, -0.3151852488517761, 2.563884735107422]
]

Analisei o JSON usando play.api.libs.json.JSON e posso extrair os valores "dps" usando:

jsonResponse = Json.parse(response.body)
for (i <- 0 until numSensors) {
dataMap = (jsonResponse.apply(i)  "dps")
}

Mas como convertê-lo em uma matriz densa com o formato acima?

Respostas:

1 para resposta № 1

Suponha que você tenha as mesmas chaves para todos dps, você pode tentar isso, criar um DenseMatrix vazio e vincular cada matriz à matriz com DenseMatrix.vertcat:

val keys = List("1477958400", "1477958401", "1477958402", "1477958403", "1477958404", "1477958405")

var mat = new DenseMatrix[Double](0, 6, Array.empty[Double])

for (i <- 0 until numSensors) {

val dataMap = (jsonResponse.apply(i)  "dps")
val array = keys.map(key => (dataMap  key).as[Double]).toArray

mat = DenseMatrix.vertcat(mat, new DenseMatrix[Double](1, 6, array))
}

mat

//breeze.linalg.DenseMatrix[Double] = 1.9519165754318237  -0.4030894637107849  0.6892277598381042  ... (6 total)
//                                    4.979776382446289   1.8036608695983887   3.0569913387298584  ...