Apache flink 如何将flink表保存到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 我对此运行查询以仅选择犬科动物,并

我用的是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文件:

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类型,但在这里没关系