2016-09-26 104 views
1

我需要將每個RDD轉換爲NavigableMap並將其存儲在List<NavigableMap<byte[], List<Map<String, String>>>>中的匿名函數中。我正在做一個JavaPairDStream<ImmutableBytesWritable, Put> puts的工作。將RDD轉換爲地圖列表

我有什麼至今:

puts.foreachRDD(r -> 
    List<NavigableMap<byte[], List<Cell>>> l = r.map(t -> 
     t._2().getFamilyCellMap()).collect(); 
    return null; 
}); 

這在拋出一個.collect()因爲NotSerializableException是Cell不序列化。

所以我需要以某種方式轉變CellMap<String, String在匿名函數,並返回List<NavigableMap<byte[], List<Map<String, String>>>>我使用.collect()

沒有多少Java 8的經驗,我很堅持在這一點上。任何幫助將不勝感激。

回答

0

這就是我最終去做的。我需要primitives之前collecting。我試圖收集.getFamilyCellMap()這是一個map的返回值,它不是serializable

然後我把它變回map之前的assertions

這裏是Java代碼:

puts.foreachRDD(r -> { 
     List<String> l = r.flatMap(t -> { 
        Collection<List<Cell>> collection = t._2().getFamilyCellMap().values(); 
      return collection.stream() 
        .flatMap(Collection::stream) 
        .map(CellUtil::cloneValue)) 
        .collect(Collectors.toList()); 
       }).collect(); 

     //Mapping for testing 
     ObjectMapper objectMapper = new ObjectMapper(); 
     Map<String, Object> map1 = objectMapper.readValue(l.get(1), new TypeReference<Map<String, Object>>(){}); 
     Map<String, Object> map2 = objectMapper.readValue(l.get(2), new TypeReference<Map<String, Object>>(){}); 

     System.out.println(map1); 
     Assert.assertEquals(map1.get("attribute1").toString(), expected1); 
     //etc 
     System.out.println(map2); 
     Assert.assertEquals(map2.get("attribute2").toString(), expected2); 
     //etc 
    } 
    return null; 
}); 

希望這可以幫助別人需要的人。