Apache flink Flink如何使用从Avro输入数据推断的模式创建表

Apache flink Flink如何使用从Avro输入数据推断的模式创建表,apache-flink,flink-sql,Apache Flink,Flink Sql,我已将Avro文件加载到Flink数据集中: AvroInputFormat测试=新的AvroInputFormat( 新路径(“PathToAvroFile”) ,genericord.class); 数据集DS=env.createInput(测试); usersDS.print(); 以下是打印DS的结果: {“N_NATIONKEY”:14,“N_NAME”:“肯尼亚”,“N_REGIONKEY”:0,“N_评论”:“未决的借口激烈地讨价还价。未决的,快速的平托豆从t身边飘过”} {“

我已将Avro文件加载到Flink数据集中:

AvroInputFormat测试=新的AvroInputFormat(
新路径(“PathToAvroFile”)
,genericord.class);
数据集DS=env.createInput(测试);
usersDS.print();
以下是打印DS的结果:

{“N_NATIONKEY”:14,“N_NAME”:“肯尼亚”,“N_REGIONKEY”:0,“N_评论”:“未决的借口激烈地讨价还价。未决的,快速的平托豆从t身边飘过”}
{“N_NATIONKEY”:15,“N_名称”:“摩洛哥”,“N_REGIONKEY”:0,“N_评论”:“rns。在非常常规的包装中,轻率大胆的法庭使用了非常大胆的血小板?”}
{“N_NATIONKEY”:16,“N_名称”:“莫桑比克”,“N_REGIONKEY”:0,“N_评论”:“s.讽刺的是,不寻常的渐近线愉快地醒来r”}
{“N_NATIONKEY”:17,“N_NAME”:“秘鲁”,“N_REGIONKEY”:1,“N_评论”:“血小板。愉快地等待依赖项在均匀的平托豆中使用。小心地沉默账户”}
{“N_NATIONKEY”:18,“N_NAME”:“CHINA”,“N_REGIONKEY”:2,“N_COMMENT”:“c dependencies.疯狂地表达notornis sleep狡猾的定期帐户.想法sleep.depos”}
{“N_NATIONKEY”:19,“N_名称”:“罗马尼亚”,“N_REGIONKEY”:3,“N_评论”:“ular渐近线是关于愤怒的乘数。表达依赖性在讽刺性的描述之上”}
{“N_NATIONKEY”:20,“N_NAME”:“沙特阿拉伯”,“N_REGIONKEY”:4,“N_评论”:“ts.无声的请求讨价还价。近距离快递包裹愉快地睡在对面”}
现在我想从DS数据集中创建一个表,它的模式和Avro文件完全相同,我的意思是列应该是N_NATIONKEY、N_NAME、N_REGIONKEY和N_COMMENT

我知道用这句话:

tablenv.registerDataSet(“tbTest”,DS,“field1,field2,…”;
我可以创建一个表并设置列,但我希望自动从数据推断列。可能吗? 另外,我试过了

tablenv.registerDataSet(“tbTest”,DS);
但它创建了一个带有模式的表:

根目录
|--f0:泛型

genericord
是表和SQL API运行时的黑盒,因为字段数量及其数据类型未定义。我建议使用一个Avro生成的类,它扩展了
SpecificRecord
。Flink的类型系统也可以识别这些特定类型,您可以使用适当的数据类型正确地处理各个字段

或者,您可以实现一个提取具有适当数据类型的字段的方法,如
getAvroInt(f0,“myField”)
getAvroString(f0,“myField”)

这方面的一些伪代码:

class AvroStringFieldExtract extends ScalarFunction {
    public String eval(GenericRecord r, String fieldName) {
        return r.get(fieldName).toString();
    }
}

tableEnv.registerFunction("getAvroFieldString", new AvroStringFieldExtract())

谢谢,这让我有点困惑。你能给我一个使用自定义自定义自定义项的简单例子吗?我在答案中添加了一个小例子。希望这有帮助。谢谢。我应该为每个Avro字段扩展一个ScalarFunction类吗?不,只为要提取的数据类型扩展。
fieldName
参数使函数通用。