八、Flink入门--TableApi & Sql

TableAPi

      • 1. 概述
      • 2. Table API编程
          • 2.1 word count例子
          • 2.2 注册表的几种方式
          • 2.3输出表的几种方式
          • 2.4 查询表
          • 2.5 Table to DataStream 或 DataSet
          • 2.6 Table 函数及转换关系
      • 3.UDF 用户自定义函数
          • 3.1编写一个udf
          • 3.2编写一个udtf
          • 3.2编写一个udaf

1. 概述

TableApi & sql的特点:

  • 声明式 :用户只需要关心做什么,不用关心怎么做
  • 高性能:底层会有一个优化器,可以对sql进行优化,达到更好的性能
  • 流批统一:相同的处理逻辑,可以流模式运行,也可以批模式运行
  • 标准稳定:语义标准遵循sql,不易变动
  • 易理解:语义明确,所见即所得

Table API自身的特点:

  • 多声明式数据处理写起来比较容易
  • 比较容易扩展标准的sql

2. Table API编程

2.1 word count例子
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);

DataSet input = env.fromElements(
        new WC("hello", 1),
        new WC("word", 2),
        new WC("mvp", 1)
);

Table table = tEnv.fromDataSet(input);//dataSet 转为 Table

Table filtered = table.groupBy("word").select("word,frequency.sum as frequency").filter("frequency=2");

DataSet result = tEnv.toDataSet(filtered, WC.class);
result.print();
2.2 注册表的几种方式

1.Table descriptor

tEnv.connect().withFormat().withSchema().registerTableSource("");

2.Table Source

TableSource csvSource = new CsvTableSource("/path/to/file", ...);
tableEnv.registerTableSource("CsvTable", csvSource);

3.DateStream或 DataSet

DataStream> stream = ...
tableEnv.registerDataStream("myTable", stream);
2.3输出表的几种方式

1.Table descriptor

tEnv.connect().withFormat().withSchema().registerTableSink("");

2.TableSink

TableSink csvSink = new CsvTableSink("/path/to/file", ...);

// define the field names and types
String[] fieldNames = {"a", "b", "c"};
TypeInformation[] fieldTypes = {Types.INT, Types.STRING, Types.LONG};

// register the TableSink as table "CsvSinkTable"
tableEnv.registerTableSink("CsvSinkTable", fieldNames, fieldTypes, csvSink);

通过调用resultTable.insertinto(“targettable”);方式将数据写入表

2.4 查询表

Table APi 查询举例:

Table revenue = orders
  .filter("cCountry === 'FRANCE'")
  .groupBy("cID, cName")
  .select("cID, cName, revenue.sum AS revSum");

sql查询举例:

Table revenue = tableEnv.sqlQuery(
    "SELECT cID, cName, SUM(revenue) AS revSum " +
    "FROM Orders " +
    "WHERE cCountry = 'FRANCE' " +
    "GROUP BY cID, cName"
  );
2.5 Table to DataStream 或 DataSet

Table类型转换为DataStream或着是DataSet

//Row类型
DataStream dsRow = tableEnv.toAppendStream(table, Row.class);
//TupleType
TupleTypeInfo> tupleType = new TupleTypeInfo<>(Types.STRING(),Types.INT());
DataStream> dsTuple = tableEnv.toAppendStream(table, tupleType);

//转为RetractStream
DataStream> retractStream = tableEnv.toRetractStream(table, Row.class);

DataSet dsRow = tableEnv.toDataSet(table, Row.class);

TupleTypeInfo> tupleType = new TupleTypeInfo<>(Types.STRING(),Types.INT());
DataSet> dsTuple =  tableEnv.toDataSet(table, tupleType);
2.6 Table 函数及转换关系

Table的方法调用类似DataSteam也是链式调用,返回的类型也是Table类型
八、Flink入门--TableApi & Sql_第1张图片
groupBy之后会生成一个GroupTable,调用select后又会转为Table类型,各个函数的作用和sql标准的作用一样

3.UDF 用户自定义函数

3.1编写一个udf

udf特点:输入输出1:1

//继承ScalarFunction,类名就是函数名
public class HashCode extends ScalarFunction {
  private int factor = 12;
  
  public HashCode(int factor) {
      this.factor = factor;
  }
  
  public int eval(String s) {
      return s.hashCode() * factor;
  }
}

BatchTableEnvironment tableEnv = TableEnvironment.getTableEnvironment(env);

//注册函数
tableEnv.registerFunction("hashCode", new HashCode(10));

//  Table API Java 用法
myTable.select("string, string.hashCode(), hashCode(string)");

//  SQL API 用法
tableEnv.sqlQuery("SELECT string, HASHCODE(string) FROM MyTable");
3.2编写一个udtf

udtf的特点是输入输出1:n

//继承TableFunction,实现eval函数
public class Split extends TableFunction> {
    private String separator = " ";
    
    public Split(String separator) {
        this.separator = separator;
    }
    
    public void eval(String str) {
        for (String s : str.split(separator)) {
            // use collect(...) to emit a row
            collect(new Tuple2(s, s.length()));
        }
    }
}
3.2编写一个udaf

udaf的特点是:输入输出n:1,继承自AggregateFunction并实现各个方法

你可能感兴趣的:(Apache,Flink)