【Flink】流执行引擎中的Table API与SQL应用(3.将Table数据输出到csv文件中 )

将Table数据输出到csv文件中

1. 在流处理引擎中创建表执行环境

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableenv = TableEnvironment.getTableEnvironment(env);

2. 创建表(注册表)并将CSV数据写入表中

String[] fields = new String[]{"id","name","age"};
TypeInformation[] fieldtype = new TypeInformation[]{Types.STRING,Types.STRING,Types.INT};
TableSource tsource = new CsvTableSource("../datasets/stuinfo.csv",fields,fieldtype);
tableenv.registerTableSource("student",tsource);

stuinfo.csv数据如下

1001,zhangsan,18
1002,lisi,20
1003,wangwu,23
1004,zhaoliu,25

3 通过SQL查看表中名称为 wangwu 的学生信息

Table t1 = tableenv.sqlQuery("select * from student where name='wangwu'");

4 将wangwu的信息输出到csv文件中

FileSystem.WriteMode.OVERWRITE 表示允许覆盖写,默认不允许覆盖写,即默认情况下接收数据的文件必须是不存在情况,FileSystem.WriteMode.OVERWRITE 的作用就是当配置用于接收输出结果的文件存在的情况下,新数据覆盖旧数据(即新生成一个文件覆盖旧文件)

4.1 方法一:使用CsvTableSink

TableSink目前仅支持 CsvTableSink 一种方式,如果想要实现其他方式的输出,只能先将Table数据写入DataStream中,再将DataStream输出。

CsvTableSink参数说明:

  • 参数1:存储数据的csv文件路径
  • 参数2:列分隔符(csv文件可看做二维表,每行就是一条记录,一行中存储多列,一般默认使用逗号做分隔符,在该方法中必须指定,所以一般指定为逗号)
  • 参数3:输出的文件数量,即将输出输出时一共使用几个文件进行存储,默认值1,一般也设置为1
  • 参数4:数据输出模式:覆盖/不覆盖,默认不覆盖(要求文件必须不存在,存在会报错),一般设置为 OVERWRITE 覆盖(文件可以存在可以不存在,文件不存在就创建,存在就覆盖)
  • 参数1、2是必须配置的,如果想要配置输出模式为覆盖模式,那么必须4个参数都配置
  • 即参数的可选搭配方式有2种(参数1,参数2)或是(参数1,参数2,参数3,参数4)
TableSink tk = new CsvTableSink("E:\\IDEAProject\\Flink_Case\\FlinkDemo\\src\\main\\java\\gongcheng21\\datasets\\wangwu.csv",",",1, FileSystem.WriteMode.OVERWRITE);
t1.writeToSink(tk);

4.2 方法二:转换为DataStream后写入csv文件

FileSystem.WriteMode.OVERWRITE 表示允许覆盖写,默认不允许覆盖写,即默认情况下接收数据的文件必须是不存在情况,FileSystem.WriteMode.OVERWRITE 的作用就是当配置用于接收输出结果的文件存在的情况下,新数据覆盖旧数据(即新生成一个文件覆盖旧文件)

// Tuple类型因为必须声明每个参数类型,所以需要TypeInformation.of(new TypeHint<>(){})来进行声明
DataStream<Tuple3<String, String,Integer>> ds = tableenv.toAppendStream(t1,TypeInformation.of(new TypeHint<Tuple3<String, String,Integer>>(){}));
// 输出数据
ds.writeAsCsv("E:\\IDEAProject\\Flink_Case\\FlinkDemo\\src\\main\\java\\gongcheng21\\datasets\\wangwu.csv", FileSystem.WriteMode.OVERWRITE);

5 方法一的完整代码

// 流执行引擎
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 表执行引擎
StreamTableEnvironment tableenv = TableEnvironment.getTableEnvironment(env);

/*
表注册: registerTableSource -- CsvTableSource
 */
 // 字段名称
String[] fields = new String[]{"id","name","age"};
// 字段类型
TypeInformation[] fieldtype = new TypeInformation[]{Types.STRING,Types.STRING,Types.INT};
TableSource tsource = new CsvTableSource("E:\\IDEAProject\\Flink_Case\\FlinkDemo\\src\\main\\java\\gongcheng21\\datasets\\stuinfo.csv",fields,fieldtype);
// 注册表
tableenv.registerTableSource("student",tsource);

/*
表数据处理
*/
// 查看表中数据
Table t1 = tableenv.scan("student").where("name='wangwu'");
// 声明TableSink
TableSink tk = new CsvTableSink("E:\\IDEAProject\\Flink_Case\\FlinkDemo\\src\\main\\java\\gongcheng21\\datasets\\wangwu.csv",",",1, FileSystem.WriteMode.OVERWRITE);
// 使用TableSink执行数据输出
t1.writeToSink(tk);
env.execute();

5 方法二的完整代码

// 流执行引擎
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 表执行引擎
StreamTableEnvironment tableenv = TableEnvironment.getTableEnvironment(env);

/*
表注册: registerTableSource -- CsvTableSource
 */
 // 字段名称
String[] fields = new String[]{"id","name","age"};
// 字段类型
TypeInformation[] fieldtype = new TypeInformation[]{Types.STRING,Types.STRING,Types.INT};
TableSource tsource = new CsvTableSource("E:\\IDEAProject\\Flink_Case\\FlinkDemo\\src\\main\\java\\gongcheng21\\datasets\\stuinfo.csv",fields,fieldtype);
// 注册表
tableenv.registerTableSource("student",tsource);

/*
表数据处理
*/
// 查看表中数据
Table t1 = tableenv.scan("student").where("name='wangwu'");
// 将表转换为DataStream类型
DataStream<Tuple3<String, String,Integer>> ds = tableenv.toAppendStream(t1,TypeInformation.of(new TypeHint<Tuple3<String, String,Integer>>(){}));
// 输出数据
ds.writeAsCsv("E:\\IDEAProject\\Flink_Case\\FlinkDemo\\src\\main\\java\\gongcheng21\\datasets\\wangwu.csv", FileSystem.WriteMode.OVERWRITE);
env.execute();

你可能感兴趣的:(大数据组件,sql,flink,java,大数据)