【问题标题】:Scala JSON to DenseMatrixScala JSON 到 DenseMatrix
【发布时间】:2017-03-04 06:57:14
【问题描述】:

我正在尝试转换此 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
      }
   }
]

进入与“dps”键关联的值的 DenseMatrix。最终的 DenseMatrix 应该如下所示:

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

我已经使用 play.api.libs.json.JSON 解析了 JSON,我什至可以使用以下方法提取“dps”值:

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

但是如何将其转换为上述格式的密集矩阵呢?

【问题讨论】:

    标签: json scala apache-spark scala-breeze


    【解决方案1】:

    假设您对所有 dps 都有相同的键,您可以试试这个,创建一个空的 DenseMatrix 并使用 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  ...
    

    【讨论】:

    • 这对您有很大帮助,谢谢!反正有没有用horzcat做同样的事情?我尝试将垫子初始化为 var mat = new DenseMatrix[Double](6, 0, Array.empty[Double]) 并使用 mat = DenseMatrix.horzcat(mat, new DenseMatrix[Double](6, 1, array)) 但编译器告诉我不可能有 6 行和 0 列 lol
    • 更具体地说,编译器在我执行horizcat 的行上说java.lang.IndexOutOfBoundsException: MajorStride == 1 is smaller than rows == 5, which is impossible。我可能解释错了。
    • 这看起来像an issue。你总是可以做vertcat,然后顺便用mat.t转置矩阵。虽然不理想。
    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2014-06-05
    • 2018-06-18
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多