在我们测试使用Flink的时候,往往需要写很多的代码去造数据,会浪费很多时间,Flink为DataStream和Table&SQL Api提供了生成数据的Source,我们可以方便的使用。
先说一下DataStream提供的DataGeneratorSource
DataGeneratorSource
描述
DataGeneratorSource抽象了数据生成器,可以轻松的生成数据。
DataGeneratorSource有状态、可以并行。
DataGeneratorSource的构造器需要传入dataGenerator
和rowsPerSecond
两个参数:
public DataGeneratorSource(DataGenerator<T> generator, long rowsPerSecond) {
this.generator = generator;
this.rowsPerSecond = rowsPerSecond;
}
DataGenerator
是一个数据生成器接口,Flink内部提供了SequenceGenerator
和RandomGenerator
,分别用来生成序列数据和随机数据。
rowsPerSecond
每秒生成的行数,默认是Long.MAX_VALUE
。
DataGenerator的泛型就是发送到下游的数据类型。
我们使用DataGeneratorSource
的时候,就可以利用SequenceGenerator
和RandomGenerator
提供的方法来生成数据。
在Flink Table的DataGenTableSourceFactory
源码中实现了RowGenerator
来生成RowData
,我们可以参考其源码自定义DataGenerator
来生成我们自己的类数据。
样例代码
这里自定义一个DataGenerator
类来生成TrafficData
流量数据。
import org.apache.commons.math3.random.RandomDataGenerator;
import org.apache.flink.api.common.functions.RuntimeContext;
import org.apache.flink.runtime.state.FunctionInitializationContext;
import org.apache.flink.streaming.api.functions.source.datagen.DataGenerator;
public class TrafficData {
// 用户id
private long userId;
// 用户所属城市id
private int cityId;