2017-04-14 2 views
1

Ich möchte die Wortzahl einer riesigen Datei mit Java tun. Ich kann Map Reduce nicht auf einer einzelnen Maschine verwenden. Anstatt Hash Map zu verwenden, möchte ich Redis verwenden, um die Worthäufigkeit zu speichern. In praktischen Daten kommt in einem Stream.Optimale Lösung für Word Count einer riesigen Datei mit Redis

Was ich dachte, dass ich die Wortzahl für jeden in Redis sortierten Satz drücken werde. Aber ich weiß es nicht optimale Lösung von nicht. Bitte geben Sie die optimale Lösung an, um das Wort Streaming-Daten zu zählen.

Java-Code für Wort zählen -

public class WordCount { 
    public static void main(String args[]) { 
     Map<String, Integer> wordMap = wordMap("filename"); 
     List<Entry<String, Integer>> list = sortByValue(wordMap); 
     for (Map.Entry<String, Integer> entry : list) { 
      System.out.println(entry.getKey() + " => " + entry.getValue()); 

     } 
    } 

    public static Map<String, Integer> wordMap(String fileName) { 
     Map<String, Integer> wordMap = new HashMap<>(); 
     try (FileInputStream fis = new FileInputStream(fileName); 
       DataInputStream dis = new DataInputStream(fis); 
       BufferedReader br = new BufferedReader(new InputStreamReader(dis))) { 
      // words are separated by whitespace 
      Pattern pattern = Pattern.compile("\\s+"); 
      String line = null; 
      while ((line = br.readLine()) != null) { 
       line = line.toLowerCase(); 
       String[] words = pattern.split(line); 
       for (String word : words) { 
        if (wordMap.containsKey(word)) { 
         wordMap.put(word, (wordMap.get(word) + 1)); 
        } else { 
         wordMap.put(word, 1); 
        } 
       } 
      } 
     } catch (IOException ioex) { 
      ioex.printStackTrace(); 
     } 
     return wordMap; 
    } 

    public static List<Entry<String, Integer>> sortByValue(Map<String, Integer> wordMap) { 
     Set<Entry<String, Integer>> entries = wordMap.entrySet(); 
     List<Entry<String, Integer>> list = new ArrayList<>(entries); 
     Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 

      @Override 
      public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) 

      { 
       return (o2.getValue()).compareTo(o1.getValue()); 
      } 
     }); 
     return list; 
    } 
} 

Antwort

0

Es gibt eine gute example, wie Map auszuführen Reduce über Redis Daten auf Java Redisson verwenden.