本文为您介绍模拟数据生成源表的使用限制、DDL定义、WITH参数和代码示例。

什么是模拟数据生成源表

模拟数据生成源表是系统内置的Connector,它根据表中每个字段提供的Java Faker表达式生成测试数据。当您在开发或测试时,需要使用一些测试数据来验证业务逻辑时,推荐您使用模拟数据生成Connector。

使用限制

  • 仅Flink计算引擎VVR 4.0.12及以上版本支持模拟数据生成Connector。
  • 支持部分数据类型,包括CHAR(n)、VARCHAR(n)、STRING、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、BOOLEAN、TIMESTAMP、ARRAY、MAP、MULTISET和ROW。

DDL定义

CREATE TABLE faker_source (
  `name` STRING,
  `age` INT
) WITH (
  'connector' = 'faker',
  'fields.name.expression' = '#{superhero.name}',
  'fields.age.expression' = '#{number.numberBetween ''0'',''1000''}'
);

WITH参数

参数 说明 数据类型 是否必填 备注
connector 源表类型。 STRING 固定值为faker。
number-of-rows 生成的数据行数。 INTEGER 如果设置了该参数,则源表是有界的,否则是无界的。
rows-per-second 生成数据的速率。 INTEGER 默认值为10000条/秒。
fields.<field>.expression 生成该字段值的Java Faker表达式。 STRING 详情请参见字段表达式
fields.<field>.null-rate 该字段值为空的占比。 FLOAT 默认值为0.0。
fields.<field>.length ARRAY、MAP或MULTISET集合类型的大小。 INTEGER 默认值为1。

字段表达式

  • 操作方法
    使用模拟数据生成Connector时,DDL中定义的每个字段,都需要在WITH语句中提供具体的表达式。表达式的固定格式为'fields.<field>.expression' = '#{className.methodName ''parameter'', ...}'。相关的参数说明如下表所示。
    参数 说明
    field 表示DDL中具体的字段名。
    className 表示Faker类的类名。

    Java Faker提供了大约80个Faker类用于生成您需要的字段表达式,您可以根据需要选择对应的类。

    说明 Faker类的类名不区分大小写。
    methodName 表示方法名。
    说明 方法名不区分大小写。
    parameter 表示方法的入参。
    说明
    • 方法的入参需要使用两个半角单引号(' )括起来。
    • 多个参数使用半角逗号(,)进行分隔。
  • 示例
    本文结合Java Faker API文档和DDL定义部分中的age字段表达式'fields.age.expression' = '#{number.numberBetween ''0'',''1000''}' 为例,为您介绍如何为DDL中的字段正确地生成SQL表达式。
    1. Java Faker API文档中,找到Number类。Number类
    2. 在Number类中找到numberBetween方法,并查看其方法描述。numberBetween

      numberBetween方法表示返回指定数字范围的值。

    3. 根据类名Number和方法名numberBetween传入方法的参数0和1000,生成age字段的SQL表达式'fields.age.expression' = '#{number.numberBetween ''0'',''1000''}'

      表示生成的age字段的值在0到1000范围内。

代码示例

CREATE TEMPORARY TABLE heros_source (
  `name` STRING,
  `power` STRING,
  `age` INT
) WITH (
  'connector' = 'faker',
  'fields.name.expression' = '#{superhero.name}',
  'fields.power.expression' = '#{superhero.power}',
  'fields.power.null-rate' = '0.05',
  'fields.age.expression' = '#{number.numberBetween ''0'',''1000''}'
);

CREATE TEMPORARY table blackhole_sink(
  `name` STRING,
  `power` STRING,
  `age` INT
) WITH (
  'connector' = 'blackhole'
);

INSERT INTO blackhole_sink SELECT * FROM heros_source;