2014-10-08 74 views
1

我有一個原始JSON在下面的格式 -如何使用scala獲取特定格式的數據?

"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和形式輸出處理爲以下各項

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

任何人可以幫助我獲得所需的輸出,請以下???

+0

根據您的輸入,您的預期輸出中的數字應該來自哪裏並不十分清楚。 – acjay 2014-10-08 13:21:51

+0

實際上數字(usedBytes)被轉換爲GB並分配給'y' – Vishwas 2014-10-08 15:46:54

回答

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

這不會是一個交鑰匙解決方案,因爲我不知道你的免費/使用的算法應該如何工作,但是這個整體方案應該能讓你在那裏。

相關問題