文档

模拟数据生成Faker

更新时间:

本文为您介绍如何使用模拟数据生成Faker连接器。

背景信息

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

模拟数据生成连接器支持的信息如下。

类别

详情

支持类型

源表和维表

运行模式

批模式和流模式

数据格式

不适用

特有监控指标

API种类

SQL

是否支持更新或删除结果表数据

不涉及

前提条件

使用限制

  • 仅Flink计算引擎VVR 4.0.12及以上版本支持模拟数据生成连接器。

  • 仅支持部分数据类型,包括CHAR(n)、VARCHAR(n)、STRING、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、BOOLEAN、TIMESTAMP、ARRAY、MAP、MULTISET和ROW。

语法结构

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。

fields.<field>.expression

生成该字段值的Java Faker表达式。

String

详情请参见字段表达式

fields.<field>.null-rate

该字段值为空的占比。

Float

0.0

fields.<field>.length

ARRAY、MAP或MULTISET集合类型的大小。

Integer

1

源表独有

number-of-rows

生成的数据行数。

Integer

-1

如果设置了该参数,则源表是有界的,否则是无界的。

rows-per-second

生成数据的速率。

Integer

10000

默认值为10000条/秒。

使用示例

  • 源表示例

    CREATE TEMPORARY TABLE heros_source (
      `character_id` INT,
      `name` STRING,
      `power` STRING,
      `phone_number` STRING,
      `age` INT,
      `address` STRING,
      `score` MAP<STRING, INT>,
      `work_locations` ARRAY<STRING>,
      `spells` MULTISET<STRING>,
      `house-points` ROW<`house` STRING, `points` INT>,
      `user_ip` STRING,
      `request_url` STRING,
      `status_code` STRING,
      `sys_time` AS PROCTIME(),
      `event_time` TIMESTAMP(3),
      WATERMARK FOR event_time AS event_time
    ) WITH (
      'connector' = 'faker',
      'fields.character_id.expression' = '#{number.numberBetween ''0'',''10000''}',
      'fields.name.expression' = '#{superhero.name}',
      'fields.power.expression' = '#{superhero.power}',
      'fields.power.null-rate' = '0.05',
      'fields.phone_number.expression' = '#{PhoneNumber.cellPhone}',
      'fields.age.expression' = '#{number.numberBetween ''0'',''1000''}',
      'fields.address.expression' ='#{harry_potter.location}',
      'fields.score.key.expression' = '#{harry_potter.character}',
      'fields.score.value.expression' = '#{number.numberBetween ''10'',''100''}',
      'fields.score.length' = '2',
      'fields.work_locations.expression' = '#{harry_potter.location}',
      'fields.work_locations.length' = '2',
      'fields.spells.expression' = '#{harry_potter.spell}',
      'fields.spells.length' = '2',
      'fields.house-points.house.expression' = '#{harry_potter.house}',
      'fields.house-points.points.expression' = '#{number.numberBetween ''10'',''100''}',
      'fields.user_ip.expression' = '#{Internet.publicIpV4Address}',
      'fields.request_url.expression' = '#{Internet.url}',
      'fields.status_code.expression' = '#{regexify ''(200|201|204|400|401|403|301){1}''}',
      'fields.event_time.expression' = '#{Date.future ''365'',''DAYS''}',
      'number-of-rows' = '30'
    );
    
    CREATE TEMPORARY table blackhole_sink(
      `character_id` INT,
      `name` STRING,
      `power` STRING,
      `phone_number` STRING,
      `age` INT,
      `address` STRING,
      `score` MAP<STRING, INT>,
      `work_locations` ARRAY<STRING>,
      `spells` MULTISET<STRING>,
      `house-points` ROW<`house` STRING, `points` INT>,
      `user_ip` STRING,
      `request_url` STRING,
      `status_code` STRING,
      `sys_time` TIMESTAMP,
      `event_time` TIMESTAMP(3)
    ) WITH (
      'connector' = 'blackhole'
    );
    
    INSERT INTO blackhole_sink SELECT * FROM heros_source;
  • 维表示例

    CREATE TEMPORARY TABLE datagen_source (
      `character_id` INT,
      `location` STRING,
      `datagen_name` STRING,
      `user_fullname` ROW<first_name STRING, last_name STRING>,
      `user_data` ARRAY<STRING>,
      `user_score` Map<STRING, INT>,
      `user_books` MULTISET<STRING>,
      `proctime` AS PROCTIME()
    ) WITH (
      'connector' = 'datagen',
      'fields.character_id.max' = '100',
      'fields.character_id.min' = '0',
      'fields.location.length' = '6',
      'fields.datagen_name.kind' = 'random',
      'fields.datagen_name.length' = '5',
      'fields.user_fullname.first_name.length' = '5',
      'fields.user_fullname.last_name.length' ='5',
      'fields.user_data.element.length' = '5',
      'fields.user_data.kind' = 'random',
      'fields.user_score.key.length' = '6',
      'fields.user_score.value.max' = '1000',
      'fields.user_score.value.min' = '2',
      'fields.user_books.element.length'= '3',
      'number-of-rows' = '2'
    );
    
    CREATE TEMPORARY TABLE faker_dim (
      `character_id` INT,
      `faker_name` STRING
    ) WITH (
      'connector' = 'faker',
      'fields.character_id.expression' = '#{number.numberBetween ''0'',''100''}',
      'fields.faker_name.expression' = '#{harry_potter.characters}'
    );
        
    SELECT
      l.character_id,
      l.location,
      l.datagen_name,
      l.user_fullname,
      l.user_data,
      l.user_score,
      l.user_books,
      c.faker_name
    FROM datagen_source AS l
    JOIN faker_dim FOR SYSTEM_TIME AS OF proctime AS c
    ON l.character_id = c.character_id;

字段表达式

  • 操作方法

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

    参数

    说明

    field

    表示DDL中具体的字段名。

    className

    表示Faker类的类名。

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

    说明

    Faker类的类名不区分大小写。

    methodName

    表示方法名。

    说明

    方法名不区分大小写。

    parameter

    表示方法的入参。

    说明
    • 方法的入参需要使用两个半角单引号(' )括起来。

    • 多个参数使用半角逗号(,)进行分隔。

  • 示例

    本文结合Java Faker API文档和语法结构部分中的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范围内。