Apache flink flink如何将JDBCInputFormat的结果转换为元组类型的数据集
我使用以下代码从jdbc获取数据:Apache flink flink如何将JDBCInputFormat的结果转换为元组类型的数据集,apache-flink,Apache Flink,我使用以下代码从jdbc获取数据: DataSet dbData = env.createInput( JDBCInputFormat.buildJDBCInputFormat() .setDrivername(bdpService.getDriver(dataSource)) .setDB
DataSet dbData =
env.createInput(
JDBCInputFormat.buildJDBCInputFormat()
.setDrivername(bdpService.getDriver(dataSource))
.setDBUrl(dbUrl)
.setQuery(sql)
.setUsername(dataSource.getUsername())
.setPassword(dataSource.getPassword())
.setRowTypeInfo(new RowTypeInfo(getTypes(transInfo)))
.finish(), getTypes(transInfo));
然后我想对数据集进行元组类型的操作,比如groupBy等。
但是它是Row类型的,我如何转换它,或者以任何其他方式实现从jdbc获取数据到数据集类型的转换
非常感谢。我按如下方式解决了这个问题:
public static class RowToTupleMapper implements ResultTypeQueryable, MapFunction<Row, Tuple>{
private Class tupleClass;
private TypeInformation[] typeInformations;
public RowToTupleMapper(Class tupleClass, TypeInformation[] typeInformations){
this.tupleClass = tupleClass;
this.typeInformations = typeInformations;
}
@Override
public Tuple map(Row value) throws Exception {
Tuple tuple = (Tuple)tupleClass.getDeclaredConstructor().newInstance();
for (int i = 0; i < value.getArity(); i++) {
Object obj = value.getField(i);
tuple.setField(obj, i);
}
return tuple;
}
@Override
public TypeInformation getProducedType() {
return new TupleTypeInfo(typeInformations);
}
}
公共静态类RowToTupleMapper实现ResultTypeQueryable、MapFunction{
私有类元组;
私有类型信息[]类型信息;
公共RowToTupleMapper(类tupleClass,类型信息[]类型信息){
this.tupleClass=tupleClass;
this.typeInformations=类型信息;
}
@凌驾
公共元组映射(行值)引发异常{
Tuple Tuple=(Tuple)tupleClass.getDeclaredConstructor().newInstance();
for(int i=0;i
使用以下帮助器类:
final String tupleClassName = "org.apache.flink.api.java.tuple.Tuple" + transInfo.getSelects().size();
final Class tupleClass = Class.forName(tupleClassName);
DataSet<Tuple> ret = dbData.map(new RowToTupleMapper(tupleClass, typeInformations));
final String tupleClassName=“org.apache.flink.api.java.tuple.tuple”+transInfo.getSelects().size();
最终类tupleClass=Class.forName(tupleClassName);
DataSet ret=dbData.map(新的RowToTupleMapper(tupleClass,typeInformations));