2014-10-08 13 views
1

나는 수도가 목록을 포함 포맷팅 및스칼라를 사용하여 특정 형식의 데이터를 얻는 방법은 무엇입니까?

"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" 
}] 

LUN을 다음 원시 JSON이있다. 내가 원하는 출력을하시기 바랍니다 얻을

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

아무도 나를 도와 드릴까요 출력 - 얻기 위해 다음과 같은 노력 다음과 같은 -

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

로 JSON과 양식을 출력 이상 처리 할 ???

+0

귀하의 입력을 기반으로 예상되는 출력의 숫자가 어디에서 왔는지는 명확하지 않습니다. – acjay

+0

실제로 숫자 (usedBytes)는 GB로 변환되어 'y'에 할당됩니다. – Vishwas

답변

2

내가 전달하고자하는 핵심 교훈은 알고리즘이 원하는 출력의 모양을 반영해야한다는 것입니다. 알고리즘을 작성하려는 결과에서 뒤로 작업하십시오.

길이 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) } 
    } 

무료/사용 알고리즘이 어떻게 작동하는지 모르겠으므로 이것은 턴키 솔루션이 될 수 없지만,이 전반적인 구성표를 사용하면 도움이 될 것입니다.