- 需求:统计文件夹下的单词出现的次数
此时我们可以使用Flink的批处理,我的data目录下有a.txt文件,输入任意的单词,然后我们开始统计。代码如下:
public class BatchHandler {
public static void main(String[] args) throws Exception{
//1 获取流式环境
ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment();
// 2 获取文件中的内容
String filepath="/home/caozg/Desktop/data";
DataSource<String> source = environment.readTextFile(filepath);
// 3 聚合计算
DataSet set = source.flatMap(new FlatMapFunction<String, Tuple2<String,Integer>>() {
public void flatMap(String s, Collector<Tuple2<String,Integer>> collector) throws Exception {
// \w 元字符用于查找单词字符
String[] values = s.toLowerCase().split("\\W");
for (String value : values) {
//key在这里就是Token,Value就是第二个元素Integer类型的数据,索引为1
collector.collect(new Tuple2<String, Integer>(value, 1));
}
}
}).groupBy(0).sum(1);
/**
* filepath:文件输出结果文件
* \n 以换行符作为每行结束条件
* " " 以空格分割单词
* setParallelism 设置并行度为1表示单线程执行,默认为多线程并行处理,这里不设置1会出现多个文件为空的结果
*/
set.writeAsCsv("/home/caozg/Desktop/data/result","\n"," ").setParallelism(1);
environment.execute("batch execute is success!");
}
}
最终的输出结果在result文件里面。这里注意几点:
- 获取执行环境和WordCount的不一样,WordCount是流处理,这里是批处理;对比如下:WordCount的环境
//获取运行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); //连接socket获取输入的数据 DataStreamSource<String> text = env.socketTextStream("127.0.0.1", port, "\n");
Batch如下:
//1 获取流式环境 ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment(); // 2 获取文件中的内容 String filepath="/home/caozg/Desktop/data"; DataSource<String> source = environment.readTextFile(filepath);
-
flatMap聚合计算默认是并行处理,因此结果会出现多个空白文件,而我为了方便观察结果,设置了并行度为2