Storm中的Stream grouping有哪几种方式?
时间: 2024-04-04 18:34:38 浏览: 13
在Storm中,Stream grouping有以下几种方式:
1. Shuffle grouping:随机分组,将 Tuple 随机分配给 Bolt 中的任务进行处理。
2. Fields grouping:按字段分组,根据指定的字段进行分组,相同字段的 Tuple 将被分配到同一个任务中进行处理。
3. All grouping:全局分组,所有的 Tuple 都会被分配给唯一的一个任务进行处理。
4. None grouping:不分组,所有的 Tuple 都会被分配给每个任务进行处理。
5. Direct grouping:直接分组,指定要将 Tuple 发送到哪个 Bolt 中的哪个任务进行处理。
6. Local or shuffle grouping:本地或随机分组,具有相同任务 ID 的 Bolt 会被分配到同一个节点上,然后使用随机分组策略分配给任务进行处理。
7. Global grouping:全局分组,所有的 Tuple 都会被分配给同一个任务进行处理。
相关问题
Stream 中的groupingBy如何使用
groupingBy是Java 8提供的一个Collector,用于对流中的元素进行分组操作。其中有一个参数是Function类型的,即根据该参数返回值进行分组。我们可以通过以下方式来使用groupingBy:
1. 根据某个属性分组
例如,我们有一个Person类,其中有一个属性为age,我们想要根据age进行分组,可以使用以下代码:
List<Person> personList = new ArrayList<>();
Map<Integer, List<Person>> ageGroupMap = personList.stream().collect(Collectors.groupingBy(Person::getAge));
2. 根据多个属性分组
如果我们想要根据多个属性进行分组,可以使用以下代码:
List<Person> personList = new ArrayList<>();
Map<String, Map<Integer, List<Person>>> nameAgeGroupMap = personList.stream().collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge)));
在这个例子中,我们首先根据name进行分组,然后再对每个组根据age进行进一步分组。
3. 收集统计值
除了分组之外,groupingBy还可以收集统计值,如求和、取平均数等。以下是一个例子:
List<Person> personList = new ArrayList<>();
Map<String, Double> nameAgeAverageAgeMap = personList.stream().collect(Collectors.groupingBy(Person::getName, Collectors.averagingDouble(Person::getAge)));
在这个例子中,我们首先根据name进行分组,然后统计每个组中的age平均值。
stream流中的groupingby
stream流中的groupingBy是一个用于分组的操作,它可以将流中的元素按照指定的条件进行分组,并将分组后的结果以Map的形式返回。例如,我们可以通过groupingBy将一个字符串流按照首字母进行分组,代码如下:
List<String> list = Arrays.asList("apple", "banana", "orange", "pear", "peach");
Map<Character, List<String>> result = list.stream().collect(Collectors.groupingBy(s -> s.charAt(0)));
这段代码将会把list中的元素按照首字母分组,返回一个Map,其中键为首字母,值为以该首字母开头的字符串列表。