【问题标题】:How to get data in specific format using scala?如何使用scala获取特定格式的数据?
【发布时间】:2014-12-03 03:05:29
【问题描述】:

我有一个以下格式的原始 json-

"luns": [
{
  "numReadBlocks": 15444876,
  "numWriteBlocks": 13530714,
  "blockSizeInBytes": 512,
  "writeIops": 495344,
  "readIops": 312702,
  "serialNumber": "aaaaaaa",
  "uuid": "id",
  "shareState": "none",
  "usedBytes": 6721716224,
  "totalSizeBytes": 16106127360,
  "path": "/vol/lun_23052014_025830_vol/lun_23052014_025830"
},
{
  "numReadBlocks": 15444876,
  "numWriteBlocks": 13530714,
  "blockSizeInBytes": 512,
  "writeIops": 495344,
  "readIops": 312702,
  "serialNumber": "aaaaaaa",
  "uuid": "id",
  "shareState": "none",
  "usedBytes": 6721716224,
  "totalSizeBytes": 16106127360,
  "path": "/vol/lun_23052014_025830_vol/lun_23052014_025830"
 }]

luns 可能包含列表。 我想处理上面的json并形成如下输出-

"topStorageLuns": [
{
    "name": "Free (in GB)",
    "data": [7.79,7.79]
},
{
    "name": "Used (in GB)",
    "data": [7.21,7.21]
}]

为了获得输出,我尝试了以下操作-

val storageLuns = myRawJson
val topStorageLuns = storageLuns.map { storageLun =>
    val totalLunsSizeOnStorageDevice = storageLun.luns.foldLeft(0.0) {
      case (totalBytesOnDevice, lun) =>
        totalBytesOnDevice + lun.usedBytes.getOrElse(0.0).toString.toLong
    }
    val totalAvailableLunsOnStorageDevice = storageLun.luns.foldLeft(0.0) {
      case (totalBytesOnDevice, lun) =>
        totalBytesOnDevice + lun.usedBytes.getOrElse(0.0).toString.toLong
    }

    Json.obj("name" -> storageLun.hostId, "data" -> "%.2f".format(totalLunsSizeOnStorageDevice / (1024 * 1024 * 1024)).toDouble)
  } 

谁能帮我得到想要的输出???

【问题讨论】:

  • 根据您的输入,您的预期输出中的数字应该来自哪里并不清楚。
  • 实际上数字(usedBytes)转换为GB并分配给'y'

标签: json scala scala-collections playframework-json


【解决方案1】:

我想传授的关键教训是,您的算法应该反映您想要的输出形状。从您想要构建算法的结果开始向后工作。

在我看来,您想创建一个长度为 2 的数组,其中每个条目都有相应的算法(已使用间隔,无空间)。在每个元素中,您需要一个嵌套数组,其中输入数组中的每个项目都有一个元素,使用外部数组的算法计算。以下是我解决问题的方法:

1) 定义您的算法

  val dfAlgorithm: (Seq[(String, JsValue)] => Double) = _.foldLeft(0.0) { (acc, item) =>
    /* whatever logic you need to do */
  }

  val duAlgorithm: (Seq[(String, JsValue)] => Double) = _.foldLeft(0.0) { (acc, item) =>
    /* whatever logic you need to do */
  }

2) 创建一个数据结构来映射以构建您的最终输出

  val stats = Seq("Free (in GB)" -> dfAlgorithm, "Used (in GB)" -> duAlgorithm)

3) 在您的算法映射中映射您的输入数据(这里的逻辑反映了您想要的结果的形状)

  stats.map { case (name, algorithm) =>
    Json.obj("name" -> name, "data" -> storageLuns.map { storageLun => algorithm(storageLun) }
  }

这不会是一个交钥匙解决方案,因为我不知道你的免费/使用算法应该如何工作,但这个整体方案应该可以让你到达那里。

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2015-08-20
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多