Storm中的Stream grouping有哪几种方式?
时间: 2024-04-03 15:30:44 浏览: 13
在Storm中,Stream grouping是指对Spout或Bolt发射的Tuple进行分组的方式。常见的Stream grouping方式包括:
1. Shuffle grouping(随机分组):Tuple被随机均匀地分配给下游的Bolt。
2. Fields grouping(按字段分组):根据指定的字段进行分组,相同字段值的Tuple会被分配到同一个Bolt中。
3. All grouping(广播):Tuple会被发送到所有的下游Bolt中,用于广播信息。
4. Global grouping(全局分组):所有的Tuple都会被分配到下游的同一个Bolt中。
5. Partial key grouping(部分键分组):根据指定的字段进行分组,相同字段值的Tuple会被分配到相同的下游Bolt中,但是不同字段值的Tuple可能会被发送到不同的Bolt中。
6. None grouping(无分组):只有一个下游Bolt时,Tuple会被直接发送给该Bolt,否则会抛出异常。
相关问题
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,其中键为首字母,值为以该首字母开头的字符串列表。