网上找的答案和官方文档表述的都不太易懂... * Author: hjm * Date: 2019/01/10 15 09 * Description: * 直接上结论吧: * 假设当一个filed有多个字段时 province city money * min 将会把最小的记录的分组字段(这里是province)& 比较字段(money)进行返回 * 而其他字段(city)将保留第一次出现的值 * 命令行输入:nc -lk 8888 * 例如输入以下数据: * -------------------------- * province,city,money * 辽宁,沈阳,1000 * 辽宁,大连,800 * 辽宁,锦州,800 * -------------------------- * 将得到:(这里money的index是2,对money进行比较) * ==>min(2) ==> 辽宁 沈阳 800 * ==>minby(2)==>辽宁 锦州 800
以下是代码:
public class MinByDemo {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);
SingleOutputStreamOperator<Tuple3<String, String, Double>> mapped = lines.map(new MapFunction<String, Tuple3<String, String, Double>>() {
@Override
public Tuple3<String, String, Double> map(String value) throws Exception {
String[] flieds = value.split(",");
String province = flieds[0];
String city = flieds[1];
Double money = Double.parseDouble(flieds[2]);
return Tuple3.of(province, city, money);
}
});
KeyedStream<Tuple3<String, String, Double>, String> keyByed = mapped.keyBy(t -> t.f0);
SingleOutputStreamOperator<Tuple3<String, String, Double>> minbyed = keyByed.minBy(2, false);
/* minBy(比较字段,false) 将会把最小的记录的那条 flieds进行返回
* 而其他字段(city)将保留第一次出现的字段
* 辽宁,沈阳,1000
* 辽宁,大连,800
* 辽宁,锦州,800
* ==>minby(2,false) ==> 辽宁 锦州 800
* 第二个布尔值类型的参数意思是 假设同一个分组有几条(money)都等于800的 而
* 且是最小的 那么要返回新的那条最小的数据的flieds;
*/
minbyed.print();
env.execute("MinByDemo");
}
}