生成测试数据
内置负载生成器可生成模拟数据,用于演示和测试。它提供了一种在不连接到实际外部数据源的情况下模拟数据流的简便方法。
使用下面的 SQL 语句将 RisingWave 连接到内置负载生成器。
句法
- Diagram
- Code
CREATE TABLE source_name ( column_name data_type, ... )
WITH (
connector = ' datagen ',
fields.column_name.column_parameter = ' value ', ... -- 为每一列配置生成器。请参阅下面的详细信息。
datagen.rows.per.second = ' rows_integer ' -- 指定每秒生成多少行数据。例如,'20'。
) FORMAT PLAIN ENCODE JSON;
WITH
选项 - column_parameter
下表显示了每种负载生成器类型可生成的数据类型。
生成器 \ 数据 | Number | Timestamp | Timestamptz | Varchar | Struct | Array |
---|---|---|---|---|---|---|
Sequence | ✓ | ✕ | ✕ | ✕ | ✓ | ✓ |
Random | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
选择要生成的数据类型。
- Number
- Timestamp and Timestamptz
- Varchar
- Struct
- Array
- Sequence
- Random
序列负载生成器可以生成从起始数字到结束数字以 1 为增量的数字。例如,1
、2
、3
、... 和 1.56
、2.56
、3.56
、...
为每一列指定以下字段。
column_parameter | 描述 | 值 | 是否必需? |
---|---|---|---|
kind | 生成器类型 | 设置为 sequence 。 | False 默认: random |
start | 起始数字 必须小于结束数字。 | 列数据类型的任意数字 示例: 50 | False 默认: 0 |
end | 结束数字 必须大于起始数字。 | 列数据类型的任意数字 示例: 100 | False 默认: 32767 |
随机数生成器会在某个范围内生成随机数。
为创建的 source 中的每一列指定以下字段。
column_parameter | 描述 | 值 | 是否必需? |
---|---|---|---|
kind | 生成器类型 | 设置为 random 。 | False 默认: random |
min | 可生成的最小数字。 必须小于最大值。 | 列数据类型的任意数字 示例: 50 | False 默认: 0 |
max | 可生成的最大数。 必须大于最小值。 | 列数据类型的任意数字 示例: 100 | False 默认: 32767 |
seed | 用于初始化随机负载生成器的种子数。生成数字的序列由种子值决定。如果给定相同的种子数,生成器将产生相同的数字序列。 | 正整数 示例: 3 | False 如果未指定,将生成一组固定的数字序列。 |
随机时间戳和带时区的时间戳生成器会生成随机时间戳和带时区的时间戳,其时区分别早于当前日期和时间或 source 创建时间。
为要创建的 source 中的每一列指定以下字段。
column_parameter | 描述 | 值 | 是否必需? |
---|---|---|---|
kind | 生成器类型 | 设置为 random 。 | False 默认: random |
max_past | 指定与基线时间戳或带时区的时间戳的最大偏差,以确定可以生成的最早时间戳或带时区的时间戳。 | 一个interval 示例: 2h 37min | False 默认: 1 day |
max_past_mode | 指定基准时间戳或带时区的时间戳。 生成的时间戳或带时区的时间戳的范围是 [基准时间 - max_past ,基准时间] | absolute — 基准时间设置为生成器的执行时间。每次生成的基准时间都是固定的。relative — 基准时间是每次生成新数据时获得的系统时间。 | False 默认: absolute |
basetime | 如果设置,生成器将忽略 max_past_mode ,并使用指定的时间作为基准时间。 | 一个日期和时间字符串 示例: 2023-04-01T16:39:57-08:00 | False 默认:生成器执行时间 |
seed | 用于初始化随机负载生成器的种子数。生成的时间戳或带时区的时间戳序列由种子值决定。如果给定相同的种子数,生成器将产生相同的时间戳或带时区的时间戳序列。 | 正整数 示例: 3 | False 如果未指定,将生成一串固定的时间戳或带时区的时间戳(如果系统时间恒定)。 |
随机 varchar 生成器会生成大小写字母和数字的随机组合。
为创建的 source 中的每一列指定以下字段。
column_parameter | 描述 | 值 | 是否必需? |
---|---|---|---|
kind | 生成器类型 | 设置为 random 。 | False 默认: random |
length | 要生成的 varchar 的长度。 | 正整数 示例: 16 | False 默认: 10 |
seed | 用于初始化随机负载生成器的种子数。生成字符的序列由种子值决定。如果给定相同的种子数,生成器将产生相同的字符序列。 | 正整数 示例: 3 | False 如果未指定,将生成固定的字符序列。 |
生成器支持生成 struct
类型的数据。struct
类型的列可以包含多个不同类型的嵌套列。
以下语句可创建包含一个列 v1
的负载生成器 Source。v1
由两个嵌套列 v2
和 v3
组成。
CREATE TABLE s1 (v1 struct<v2 int, v3 double>)
WITH (
connector = 'datagen',
fields.v1.v2.kind = 'sequence',
fields.v1.v2.start = '-10',
fields.v1.v3.kind = 'sequence',
fields.v1.v3.start = '1.5',
datagen.rows.per.second = '5'
) FORMAT PLAIN ENCODE JSON;
info
- 您需要配置 struct 中的每个嵌套列。请根据嵌套列的数据类型选择其他选项卡,以获取有关列参数的信息。
- 配置嵌套列时,请使用
column.nested_column
进行指定。例如,上述WITH
子句中的v1.v2
和v1.v3
。
生成器还支持生成数组
类型的数据。数组是相同类型元素的列表。创建 source 时,在列的数据类型后添加 []
。
以下语句可创建包含一个列 c1
的负载生成器 Source。c1
是一个 varchar
数组。
CREATE TABLE s1 (c1 varchar [])
WITH (
connector = 'datagen',
fields.c1.length = '3',
fields.c1._.kind = 'random',
fields.c1._.length = '1',
fields.c1._.seed = '3',
datagen.rows.per.second = '10'
) FORMAT PLAIN ENCODE JSON;
info
- 您需要在
WITH
子句中指定数组中元素的个数。上面示例中的fields.c1.length = '3'
表示c1
是一个包含三个元素的数组。 - 配置数组中的元素时,请使用
column._
进行指定。例如,上述WITH
子句中的c1._
。
请根据数组的数据类型选择其他选项卡,以获取有关列参数的信息。
如果要生成一个 struct 数组,语句应如下所示。
CREATE TABLE s1 (v1 struct<v2 int> [])
WITH (
connector = 'datagen',
fields.v1.length = '2',
fields.v1._.v2.kind = 'random',
fields.v1._.v2.min = '1',
fields.v1._.v2.max = '2',
fields.v1._.v2.seed = '1',
datagen.rows.per.second = '10'
) FORMAT PLAIN ENCODE JSON;
示例
下面是将 RisingWave 连接到内置负载生成器的示例。
下面的语句可创建名为 s1
的 source,包含五列:
i1
— 由三个整数组成的数组,从 1 开始并以 1 递增v1
— 包含随机整数v2
(范围从 -10 到 10) 和随机浮点数v3
(范围从 15 到 55)的 structt1
— 随机时间戳,从生成器执行时间前 2 小时 37 分钟开始z1
— 随机带时区的时间戳,从生成器执行时间前 2 小时 37 分钟开始c1
— 随机字符串,每个字符串由 16 个字符组成
CREATE TABLE s1 (i1 int [], v1 struct<v2 int, v3 double>, t1 timestamp, z1 timestamptz, c1 varchar)
WITH (
connector = 'datagen',
fields.i1.length = '3',
fields.i1._.kind = 'sequence',
fields.i1._.start = '1',
fields.v1.v2.kind = 'random',
fields.v1.v2.min = '-10',
fields.v1.v2.max = '10',
fields.v1.v2.seed = '1',
fields.v1.v3.kind = 'random',
fields.v1.v3.min = '15',
fields.v1.v3.max = '55',
fields.v1.v3.seed = '1',
fields.t1.kind = 'random',
fields.t1.max_past = '2h 37min',
fields.t1.max_past_mode = 'relative',
fields.t1.seed = '3',
fields.z1.kind = 'random',
fields.z1.max_past = '2h 37min',
fields.z1.max_past_mode = 'relative',
fields.z1.seed = '3',
fields.c1.kind = 'random',
fields.c1.length = '16',
fields.c1.seed = '3',
datagen.rows.per.second = '10'
) FORMAT PLAIN ENCODE JSON;
让我们在几秒钟后查询 s1
。
SELECT * FROM s1 ORDER BY i1 LIMIT 20;
i1 | v1 | t1 | z1 | c1
------------+--------------------------+----------------------------+----------------------------------+------------------
{1,2,3} | (7,53.96978949033611) | 2023-11-28 13:35:04.967040 | 2023-11-28 21:35:04.967330+00:00 | pGWJLsbmPJZZWpBe
{4,5,6} | (5,44.24453663454818) | 2023-11-28 14:13:15.264457 | 2023-11-28 22:13:15.264481+00:00 | FT7BRdifYMrRgIyI
{7,8,9} | (3,18.808367835800485) | 2023-11-28 15:12:41.918935 | 2023-11-28 23:12:41.919590+00:00 | 0zsMbNLxQh9yYtHh
{10,11,12} | (-4,26.893033246334525) | 2023-11-28 14:55:43.193883 | 2023-11-28 22:55:43.193917+00:00 | zujxzBql3QHxENyy
{13,14,15} | (-3,28.68505963291612) | 2023-11-28 13:35:05.967253 | 2023-11-28 21:35:05.967520+00:00 | aBJTDJpinRv8mLvQ
{16,17,18} | (4,36.32012760913261) | 2023-11-28 14:13:16.264624 | 2023-11-28 22:13:16.264646+00:00 | HVur4zU3hQFgVh74
{19,20,21} | (-10,16.212694434604053) | 2023-11-28 15:12:42.919339 | 2023-11-28 23:12:42.919465+00:00 | LVLAhd1pQvhXVL8p
{22,23,24} | (-8,28.388082274426225) | 2023-11-28 14:55:44.193726 | 2023-11-28 22:55:44.193787+00:00 | siFqrkdlCnNZqAUT
{25,26,27} | (2,40.86763449564268) | 2023-11-28 15:19:51.600898 | 2023-11-28 23:19:51.600977+00:00 | ORjwy3oMNbl1Yi6X
{28,29,30} | (3,29.179236922708526) | 2023-11-28 15:27:49.755084 | 2023-11-28 23:27:49.755105+00:00 | YIVLnWxHyfsiPHQo
{31,32,33} | (6,26.03842827701958) | 2023-11-28 16:07:02.012019 | 2023-11-29 00:07:02.012133+00:00 | lpzCxwpoJp9njIAa
{34,35,36} | (-2,20.2351457847852) | 2023-11-28 14:23:37.167393 | 2023-11-28 22:23:37.167453+00:00 | oW8xmndvmXMRp1Rc
{37,38,39} | (2,36.51138960926262) | 2023-11-28 15:19:52.600699 | 2023-11-28 23:19:52.600741+00:00 | 0m1Qxn96Xeq42H3Z
{40,41,42} | (0,34.2997487580596) | 2023-11-28 15:27:50.754878 | 2023-11-28 23:27:50.754899+00:00 | 1jT3TnEEj56YNa7w
{43,44,45} | (7,39.13577932700749) | 2023-11-28 16:07:03.011837 | 2023-11-29 00:07:03.011905+00:00 | linRToOjph0WlJrd
{46,47,48} | (7,37.43674199879566) | 2023-11-28 14:23:38.167161 | 2023-11-28 22:23:38.167271+00:00 | beql98l3IIkjomTl
{49,50,51} | (1,41.62099792202798) | 2023-11-28 15:24:46.803776 | 2023-11-28 23:24:46.803844+00:00 | xHbIYlJismRlIKFw
{52,53,54} | (9,49.240259695092895) | 2023-11-28 15:39:22.752067 | 2023-11-28 23:39:22.752115+00:00 | TDYNZsSNYMpOpZgC
{55,56,57} | (6,54.64984398127376) | 2023-11-28 13:32:15.049957 | 2023-11-28 21:32:15.050089+00:00 | jqPQM3oyA2lOXLcn
{58,59,60} | (-4,54.197350082045176) | 2023-11-28 14:07:53.278392 | 2023-11-28 22:07:53.278457+00:00 | 72cIOHPb7DE8FTme
(20 rows)
...