Apache flink 如何将flink表保存到csv文件?
我用的是Flink 1.4.0 我试图将表API查询的结果保存到CSV文件,但我 得到一个错误。 详情如下: 我的输入文件如下所示: id,species,color,weight,name 311,canine,golden,75,dog1 312,canine,brown,22,dog2 313,feline,gray,8,cat1 id、种类、颜色、重量、名称 311,狗,金,75,狗1 312,狗,布朗,22,狗2 313,猫,灰色,8,cat1 我对此运行查询以仅选择犬科动物,并希望将其保存到 csv文件:Apache flink 如何将flink表保存到csv文件?,apache-flink,Apache Flink,我用的是Flink 1.4.0 我试图将表API查询的结果保存到CSV文件,但我 得到一个错误。 详情如下: 我的输入文件如下所示: id,species,color,weight,name 311,canine,golden,75,dog1 312,canine,brown,22,dog2 313,feline,gray,8,cat1 id、种类、颜色、重量、名称 311,狗,金,75,狗1 312,狗,布朗,22,狗2 313,猫,灰色,8,cat1 我对此运行查询以仅选择犬科动物,并
ExecutionEnvironment env =
ExecutionEnvironment.getExecutionEnvironment();
BatchTableEnvironment tableEnv =
TableEnvironment.getTableEnvironment(env);
String inputPath = "location-of-source-file";
CsvTableSource petsTableSource = CsvTableSource.builder()
.path(inputPath)
.ignoreFirstLine()
.fieldDelimiter(",")
.field("id", Types.INT())
.field("species", Types.STRING())
.field("color", Types.STRING())
.field("weight", Types.DOUBLE())
.field("name", Types.STRING())
.build();
// Register our table source
tableEnv.registerTableSource("pets", petsTableSource);
Table pets = tableEnv.scan("pets");
Table counts = pets
.groupBy("species")
.select("species, species.count as count")
.filter("species === 'canine'");
// Convert to Dataset and display results
DataSet<Row> result = tableEnv.toDataSet(counts, Row.class);
result.print();
// Write Results to File
TableSink<Row> sink = new CsvTableSink("/home/hadoop/output/pets.csv", ",");
counts.writeToSink(sink);
ExecutionEnvironment环境=
getExecutionEnvironment();
BatchTableEnvironment tableEnv=
TableEnvironment.getTableEnvironment(env);
String inputPath=“源文件的位置”;
CsvTableSource petsTableSource=CsvTableSource.builder()
.path(输入路径)
.ignoreFirstLine()
.fieldDelimiter(“,”)
.field(“id”,Types.INT())
.field(“种类”,类型.STRING())
.field(“颜色”,类型.STRING())
.field(“权重”,类型.DOUBLE())
.field(“名称”,类型.STRING())
.build();
//注册我们的表源
tableEnv.registerTableSource(“pets”,petsTableSource);
表pets=表环境扫描(“pets”);
表计数=宠物
.groupBy(“物种”)
.选择(“种类,种类.计数为计数”)
.filter(“物种==‘犬科’”);
//转换为数据集并显示结果
数据集结果=tableEnv.toDataSet(计数,行.类);
result.print();
//将结果写入文件
TableLink接收器=新的CsvTableSink(“/home/hadoop/output/pets.csv”、“,”);
计数。写入接收器(接收器);
运行此命令时,我看到数据集的结果被输出:犬科,2 但是,我在输出文件中没有得到任何结果,我看到了这些 下面是错误。我能做些什么来解决这个问题?谢谢 2018-05-27 13:29:17,040 INFO [main] typeutils.TypeExtractor (TypeExtractor.java:1873) - class org.apache.flink.types.Row does not contain a getter for field fields 2018-05-27 13:29:17,040 INFO [main] typeutils.TypeExtractor (TypeExtractor.java:1876) - class org.apache.flink.types.Row does not contain a setter for field fields 2018-05-27 13:29:17,040 INFO [main] typeutils.TypeExtractor (TypeExtractor.java:1911) - class org.apache.flink.types.Row is not a valid POJO type because not all fields are valid POJO fields. 2018-05-27 13:29:17,047 INFO [main] typeutils.TypeExtractor (TypeExtractor.java:1873) - class org.apache.flink.types.Row does not contain a getter for field fields 2018-05-27 13:29:17,047 INFO [main] typeutils.TypeExtractor (TypeExtractor.java:1876) - class org.apache.flink.types.Row does not contain a setter for field fields 2018-05-27 13:29:17,047 INFO [main] typeutils.TypeExtractor (TypeExtractor.java:1911) - class org.apache.flink.types.Row is not a valid POJO type because not all fields are valid POJO fields. 2018-05-27 13:29:17040信息[main]typeutils.TypeExtractor(TypeExtractor.java:1873)-类org.apache.flink.types.Row不包含字段的getter 2018-05-27 13:29:17040信息[main]typeutils.TypeExtractor(TypeExtractor.java:1876)-类org.apache.flink.types.Row不包含字段的setter 2018-05-27 13:29:17040信息[main]typeutils.TypeExtractor(TypeExtractor.java:1911)-类org.apache.flink.types.Row不是有效的POJO类型,因为并非所有字段都是有效的POJO字段。 2018-05-27 13:29:17047信息[main]typeutils.TypeExtractor(TypeExtractor.java:1873)-类org.apache.flink.types.Row不包含字段的getter 2018-05-27 13:29:17047信息[main]typeutils.TypeExtractor(TypeExtractor.java:1876)-类org.apache.flink.types.Row不包含字段的setter 2018-05-27 13:29:17047信息[main]typeutils.TypeExtractor(TypeExtractor.java:1911)-类org.apache.flink.types.Row不是有效的POJO类型,因为并非所有字段都是有效的POJO字段。
你可能错过了一个机会
env.execute();
之后
counts.writeToSink(sink);
与立即触发执行的print()
不同,writeToSink()
只是附加了一个sink操作符,需要显式触发执行
TypeExtractor
的INFO
消息“只是”告诉您,Row
不能用作POJO类型,但在这里没关系