说明:一般用户常用的是GenericRowData
。flink内部则多使用BinaryRowData
。
方法一、循环解决(不推荐):
代码较为复杂需要根据RowType
获取到内部fields的logicalType,再使用RowData.createFieldGetter
方法创建fieldGetters
。
public static void copyRowData(RowData input, GenericRowData output, List<RowData.FieldGetter> fieldGetters) {for (int i = 0; i < input.getArity() && i < output.getArity(); i++) {if (input instanceof GenericRowData) {output.setField(i, ((GenericRowData) input).getField(i));} else {Preconditions.checkArgument(fieldGetters != null);Object value = fieldGetters.get(i).getFieldOrNull(input);output.setField(i, value);}}}
方法二、使用RowDataSerializer(推荐)
使用RowDataSerializer.copy
方法
public RowDataSerializer(RowType rowType) {
...
}public RowData copy(RowData from) {
...
}