Storm中的Stream grouping有哪几种方式?
时间: 2024-04-03 11:32:41 浏览: 13
在Storm中,Stream grouping用于将Spout或Bolt发射的Tuple路由到下游Bolt的任务中。以下是Storm中的几种Stream grouping方式:
1. Shuffle grouping:随机分组,每个Tuple随机发送到下游Bolt的任务中。
2. Fields grouping:按字段分组,具有相同字段值的Tuple被发送到相同的任务中。
3. All grouping:广播分组,每个Tuple会被发送到所有下游Bolt的任务中。
4. Global grouping:全局分组,每个Tuple只会被发送到下游Bolt的一个任务中。
5. Direct grouping:直接分组,开发人员可以控制将Tuple发送到哪个具体的下游Bolt任务中。
6. Partial key grouping:部分键分组,按照指定的字段进行hash分组,具有相同hash值的Tuple被发送到相同的任务中。
这些Stream grouping方式可以根据具体业务需求进行选择和组合使用。
相关问题
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,其中键为首字母,值为以该首字母开头的字符串列表。