Flink-Table BatchTableEnvironment实践编程(二)

为君一笑 提交于 2020-01-14 20:34:37

了解了flink table 简单概念,在开发中实际操作起来,看一下代码的具体实践
一、BatchTableEnvironment用于批处理场景,批处理的对象分别是 Java 的 DataSet 和 Scala 的 DataSet,BatchTableEnvironment 提供了 DataSet 和 Table 之间相互转换的接口
二、本实例主要是计算学生的总得分数,采用原始cvs文本作为source输入
三、涉及的cvs文本信息如下:

学生姓名 性别 学科 分数
张三 语文 90.5
张三 数学 100
张三 外语 80
李四 语文 68
王二 外语 99

四、依赖的实体类信息如下:
    @Data
    public class StudentInfo {
        private String name;
        private String sex;
        private String course;
        private Float score;
        private Long timestamp;
    }
    @Data
    public class StudentScoreResult {
        public String name;
        public float sum_total_score;
        public StudentScoreResult() {}
    }
五、具体flink代码实现信息如下:

        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        final BatchTableEnvironment tableEnv = BatchTableEnvironment.create(env);

        //source,这里读取CSV文件,并转换为对应的Class
        DataSet<StudentInfo> studentCsvInput = env
                .readCsvFile("/Users/springk/Documents/student.csv")
                .ignoreFirstLine().pojoType(StudentInfo.class,"name","sex","course","score");

        //将DataSet转换为Table
        Table studentInfo =  tableEnv.fromDataSet(studentCsvInput);
        //将studentInfo注册为一个表
        tableEnv.registerTable("studentInfo",studentInfo);
        //查询每个学生所有学科总分数
        Table studentTable = tableEnv.sqlQuery("select name,sum(score) as sum_total_score from studentInfo group by name order by 2 desc");

        //table和dataset的转换
        DataSet<StudentScoreResult> result = tableEnv.toDataSet(studentTable, StudentScoreResult.class);

        //将dataset map成tuple输出
        result.map(new MapFunction<StudentScoreResult, Tuple2<String, Float>>() {
            @Override
            public Tuple2<String, Float> map(StudentScoreResult result){
                String country = result.name;
                float sum_total_score = result.sum_total_score;
                return Tuple2.of(country,sum_total_score);
            }
        }).print();

        //sink数据输出
        String[] fieldNames={"name","sum_total_score"};
        TypeInformation[] fieldTypes = {Types.STRING, Types.FLOAT};
        // 默认为8个文件,每个随机写入,文件只能写入一次,再次执行会报错:
        //  Caused by: java.nio.file.FileAlreadyExistsException: File already exists: /Users/wangjieying/Documents/tt-sink.csv/4
        //        TableSink tableSink = new CsvTableSink("/Users/wangjieying/Documents/student-sink.csv","-");
        TableSink tableSink = new CsvTableSink("/Users/springk/Documents/student-sink.csv","    ",1, FileSystem.WriteMode.OVERWRITE);
        tableEnv.registerTableSink("studentScoreRank", fieldNames, fieldTypes, tableSink);
        studentTable.insertInto("studentScoreRank");

        env.execute("studentScoreAnalyse");

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!