本文为您介绍如何使用模拟数据生成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表达式。
在Java Faker API文档中,找到Number类。
在Number类中找到numberBetween方法,并查看其方法描述。
numberBetween方法表示返回指定数字范围的值。
根据类名Number和方法名numberBetween传入方法的参数0和1000,生成age字段的SQL表达式'fields.age.expression' = '#{number.numberBetween ''0'',''1000''}' 。
表示生成的age字段的值在0到1000范围内。