【问题标题】:How to create a hashMap of particular fields from RDD[String]?如何从 RDD [String] 创建特定字段的 hashMap?
【发布时间】:2016-09-09 04:04:40
【问题描述】:

如何从 RDD[String] 创建特定字段的 hashMap ?

  {
    count: 1,
    itemId: "1122334",
    country: {
        code: {
            preferred: "USA"
        },
        name: {
            preferred: "America"
        }
    },
    states: "50",
    self: {
        otherInfo: [

        ],
        preferred: "National Parks"
    },
    Rating: 4

    }

Ho do I get a hashmap maps which have {itemid , self.preferred} :

itemId : 1122334  self.preferred : "National Parks"
itemId : 1144444  self.preferred : "State Parks"
....

我试过这个,它工作但效率不高,因为我正在转换为 JSON Obj 并进行解析:

 val filteredMappingsList = countryMapping.filter(x=> {
    val jsonObj = new JSONObject(x)
    jsonObj.has("itemId") && jsonObj.get("itemId").toString.startsWith("11")

})

val finalMapping = filteredMappingsList.map(x=>{
    val jsonObj = new JSONObject(x);
    val itemId = jsonObj.get("itemId").toString()
    val preferred = jsonObj.getJSONObject("self").get("preferred ").toString()
    (itemId, preferred)
}).collectAsMap

有没有其他方法可以有效地做到这一点?

【问题讨论】:

    标签: scala apache-spark hashmap apache-spark-sql rdd


    【解决方案1】:

    使用众多 JSON 库之一来解析您的数据可能仍然是您的最佳选择。但是,您似乎将字符串解析为 JSON 两次,一次在过滤器中,一次在地图中。我不确定这是否是它实际执行的方式。但考虑只解析一次:

    val result = countryMapping.map(x => newJSONObject(x)).
                   filter(jsonObj => ...).
                   map{jsonObj =>
                     ...
                     (itemId, preferred)
                     }.collectAsMap
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2019-09-30
      • 2013-12-19
      • 2020-08-24
      • 2021-09-23
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2020-03-22
      相关资源
      最近更新 更多