Apache Flink SQL示例

本章讲解如何使用Flink SQL进行批处理操作。

这里我提取了2016年中超联赛射手榜的数据,通过Flink SQL进行简单的汇总。

1、源数据
这里保存为csv格式:

2、在pom中添加Table API的依赖:
<dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table_2.11</artifactId>
            <version>${flink.version}</version>
</dependency>
1
2
3
4
5
3、案例

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.BatchTableEnvironment;


public class TableJob {

    public static void main(String[] args) throws Exception{
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        BatchTableEnvironment tableEnv = BatchTableEnvironment.getTableEnvironment(env);

        //source,这里读取CSV文件,并转换为对应的Class
        DataSet<TopScorers> csvInput = env
                .readCsvFile("E://flink-training-exercises//src//main//resource//2016_Chinese_Super_League_Top_Scorers.csv")
                    .ignoreFirstLine() .pojoType(TopScorers.class,"rank","player","country","club","total_score","total_score_home","total_score_visit","point_kick");

        //将DataSet转换为Table
        Table topScore = tableEnv.fromDataSet(csvInput);
        //将topScore注册为一个表
        tableEnv.registerTable("topScore",topScore);
        //查询球员所在的国家,以及这些国家的球员(内援和外援)的总进球数
        Table groupedByCountry = tableEnv.sql("select country,sum(total_score) as sum_total_score from topScore group by country order by 2 desc");
        //转换回dataset
        DataSet<Result> result = tableEnv.toDataSet(groupedByCountry,Result.class);

        //将dataset map成tuple输出
        result.map(new MapFunction<Result, Tuple2<String,Integer>>() {
            @Override
            public Tuple2<String, Integer> map(Result result) throws Exception {
                String country = result.country;
                int sum_total_score = result.sum_total_score;
                return Tuple2.of(country,sum_total_score);
            }
        }).print();

    }

    /**
     * 源数据的映射类
     */
    public static class TopScorers {
        /**
         * 排名,球员,国籍,俱乐部,总进球,主场进球数,客场进球数,点球进球数
         */
        public int rank;
        public String player;
        public String country;
        public String club;
        public int total_score;
        public int total_score_home;
        public int total_score_visit;
        public int point_kick;

        public TopScorers() {
            super();
        }
    }

    /**
     * 统计结果对应的类
     */
    public static class Result {
        public String country;
        public int sum_total_score;

        public Result() {}
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
4、说明
这里注意一下csv的格式,由于第一行是个说明行,所以在处理时要将第一行去掉:

ignoreFirstLine() 
1
另外,本统计是想统计在这份榜单中,以球员所在的国家进行分组,然后统计进球数。

通过sql:

"select country,sum(total_score) as sum_total_score from topScore group by country order by 2 desc"
1
来实现,并将结果按照进球数倒叙排列。

5、结果


从结果中可以看出,巴西球员最受各俱乐部欢迎,而且以巴西为主的南美洲以及非洲球员,都是各队比较喜欢的。

6、结论:
首先,南美球员技术出众,单兵作战能力强,而且南美球员不觉得来中超踢球是件丢人的事,所以很适合中超;第二,非洲球员身体素质出色,对抗能力强,前场突击能力也是各俱乐部看中的地方。第三,国内球员表现疲软,排名前30名的国内球员,总共进球数才43,也能从侧面反映出国足目前锋无力的情况是多么严重了。
--------------------- 

转载于:https://my.oschina.net/xiaominmin/blog/3055788

以下是一个基于 Flink SQL API 的单元测试代码示例,该代码测试了一个简单的 Flink SQL 查询: ```java import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.bridge.java.BatchTableEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.types.Row; import org.junit.Test; import static org.junit.Assert.assertEquals; public class FlinkSqlUnitTest { @Test public void testFlinkSql() throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); // 创建测试数据 env.setParallelism(1); env.fromElements(Tuple2.of("Alice", 23), Tuple2.of("Bob", 35), Tuple2.of("Charlie", 40)) .toTable(tEnv, "name, age"); // 执行测试任务 Table result = tEnv.sqlQuery("SELECT * FROM name_age WHERE age > 30"); // 验证测试结果 tEnv.toRetractStream(result, Row.class) .returns(Types.TUPLE(Types.BOOLEAN, Types.ROW_NAMED(new String[]{"name", "age"}, Types.STRING, Types.INT))) .map(tuple -> tuple.f1) .returns(Types.ROW_NAMED(new String[]{"name", "age"}, Types.STRING, Types.INT)) .addSink(new StreamSinkFunction<>()); // 执行测试任务 env.execute(); } } ``` 该代码使用 Flink 的 StreamTableEnvironment,创建了一个简单的表,然后执行了一个 Flink SQL 查询,查询年龄大于 30 的人的信息。最后,使用 Flink 的 TestingUtils 工具类来验证测试结果是否正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值