本文为您介绍如何使用模拟数据生成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。
-
Faker作为维表Join时,并不执行实际的维表查找动作,而是根据源表传入的lookup key直接生成返回结果。
语法结构
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 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' = 'faker',
'fields.character_id.expression' = '#{number.numberBetween ''0'',''10000''}',
'fields.location.expression' = '#{harry_potter.location}',
'fields.datagen_name.expression' = '#{superhero.name}',
'fields.user_fullname.first_name.expression' = '#{superhero.prefix}',
'fields.user_fullname.last_name.expression' = '#{superhero.suffix}',
'fields.user_data.expression' = '#{harry_potter.character}',
'fields.user_data.length' = '2',
'fields.user_score.key.expression' = '#{harry_potter.character}',
'fields.user_score.value.expression' = '#{number.numberBetween ''10'',''100''}',
'fields.user_score.length' = '2',
'fields.user_books.expression' = '#{book.title}',
'fields.user_books.length' = '2',
'number-of-rows' = '5'
);
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范围内。
-