datafaker — 测试数据生成工具

2022-01-18 18:10:35 浏览数 (1)

datafaker是一个大批量测试数据和流测试数据生成工具,兼容python2.7和python3.4 。

github项目地址:https://github.com/gangly/datafaker

安装

以下以python3为例安装datafaker。

首先确保安装python3以及pip3,然后通过pip3进行安装

代码语言:javascript复制
pip3 install datafakerCopy

安装对应数据包

对于不同的数据库需要用到不同的python包,若在执行过程中报包缺失问题。 请pip安装对应包

数据库

python包

备注

mysql/tidb

mysql-python/mysqlclient

windows python3请使用mysqlclient

oracle

cx-Oracle

同时需要下载orale相关库

postgresql/redshift

psycopg2

根据sqlachemy选择对应包

sqlserver

pyodbc

mssql pyodbc

Hbase

happybase,thrift

es

elasticsearch

hive

pyhive

kafka

kafka-python

以下以centos7中python3安装mysqlclient为例:

参考官网:https://pypi.org/project/mysqlclient/

代码语言:javascript复制
sudo yum install python3-devel mysql-devel
pip3 install mysqlclientCopy

使用举例

$代表终端提示符

查看版本号,查看参数使用说明

代码语言:javascript复制
$ datafaker --version
0.0.8

$ datafaker --help
usage: datafaker [-h] [--meta [META]] [--interval INTERVAL] [--version]
                 [--outprint] [--outspliter OUTSPLITER] [--locale LOCALE]
                 [--outfile OUTFILE] [--format FORMAT]
                 [--withheader]
                 [dbtype] [connect] table [num]

Generates SQLAlchemy model code from an existing database.

positional arguments:
  dbtype                data source type
  connect               connect info to the database
  table                 table to process
  num                   number of records to generate

optional arguments:
  -h, --help            show this help message and exit
  --meta [META]         meta file path
  --interval INTERVAL   meta file path
  --version             print the version number and exit
  --outprint            print fake date to screen
  --outspliter OUTSPLITER
                        print data, to split columns
  --locale LOCALE       which country language
  --format FORMAT       outprint and outfile format: json, text (default:
                        text)

在mysql中创建学生表

代码语言:javascript复制
create table stu (
  id int unsigned auto_increment primary key COMMENT '自增id',
  name varchar(20) not null comment '学生名字',
  school varchar(20) not null comment '学校名字',
  nickname varchar(20) not null comment '学生小名',
  age int not null comment '学生年龄',
  class_num int not null comment '班级人数',
  score decimal(4,2) not null comment '成绩',
  phone bigint not null comment '电话号码',
  email varchar(64) comment '家庭网络邮箱',
  ip varchar(32) comment 'IP地址',
  address text comment '家庭地址'
) engine=InnoDB default charset=utf8;
Copy

编写元数据meta.txt,这是个学生表描述。

其中meta.txt文件内容为:

代码语言:javascript复制
id||int||自增id[:inc(id,1)]
name||varchar(20)||学生名字
school||varchar(20)||学校名字[:enum(file://names.txt)]
nickname||varchar(20)||学生小名[:enum(鬼泣, 高小王子, 歌神, 逗比)]
age||int||学生年龄[:age]
class_num||int||班级人数[:int(10, 100)]
score||decimal(4,2)||成绩[:decimal(4,2,1)]
phone||bigint||电话号码[:phone_number]
email||varchar(64)||家庭网络邮箱[:email]
ip||varchar(32)||IP地址[:ipv4]
address||text||家庭地址[:address]

meta.txt文件中每行数据为元数据的一个字段描述,以||分割为三列,若以#开头,则忽略该行。

  • 第一列:字段名
  • 第二列:表字段类型
  • 第三列:字段注释,其中包含构造规则标识

name不加标记则会随机产生20字符内的字符串,可以加上改为:学生名字[:name]

其中学校名字:enum(file://names.txt)表示从本地文件names.txt中读取枚举数据,表示学校名称只能从下面这5所学校中随机产生。names.txt内容如下:

代码语言:javascript复制
清华中学
人和中心
广东中学
猪场
旧大院

后面将详细介绍构造规则说明

注意:meta.txt和names.txt需要放在同一个目录下,再运行datafaker命令

如果没有enum类型从文件读取数据,则不需要names.txt文件

从本地文件meta.txt中读取元数据,以,,分隔符构造10条数据,打印在屏幕上

代码语言:javascript复制
$ datafaker rdb mysql mysqldb://root:root@localhost:3600/test?charset=utf8 stu 10 --outprint --meta meta.txt --outspliter ,,

1,,鲍红,,人和中心,,高小王子,,3,,81,,55.6,,13197453222,,mwei@gmail.com,,192.100.224.255,,江苏省西宁市梁平朱路I座 944204
2,,刘东,,清华中学,,高小王子,,3,,31,,52.4,,15206198472,,lili@kong.cn,,203.0.190.6,,内蒙古自治区嘉禾市兴山呼和浩特街E座 706421
3,,匡静,,人和中心,,歌神,,9,,84,,72.51,,18944398099,,zouchao@gmail.com,,203.1.53.166,,安徽省永安市沈河惠州街x座 345415
4,,王宇,,猪场,,逗比,,6,,89,,19.3,,18628114285,,na58@cai.net,,169.4.126.215,,山西省梧州县朝阳何路y座 846430
5,,陆桂芝,,猪场,,逗比,,8,,99,,92.22,,13304570255,,na55@ti.cn,,168.136.127.200,,江苏省英县徐汇尹街C座 908240
6,,顾阳,,猪场,,歌神,,9,,32,,43.14,,18025578420,,linping@pr.net,,174.50.222.39,,黑龍江省惠州县梁平大冶街Z座 611736
7,,杨洁,,人和中心,,鬼泣,,6,,35,,81.25,,13654306263,,minzhong@xiaxia.cn,,100.57.79.2,,湖北省琳市沙湾汪街V座 544660
8,,申璐,,人和中心,,鬼泣,,6,,14,,73.61,,13866020503,,changxiulan@chaoxia.cn,,198.248.254.56,,陕西省合山县东丽宁德街Q座 810017
9,,申强,,广东中学,,逗比,,7,,48,,90.65,,13915915013,,ysun@chao.cn,,169.210.122.39,,甘肃省冬梅县城北六安街Z座 619755
10,,李丹丹,,旧大院,,鬼泣,,3,,67,,87.63,,18899812516,,xiulanmo@qin.cn,,192.52.218.133,,湖南省宜都县萧山澳门街E座 791911
generated records : 10
printed records : 10
time used: 0.458 s
代码语言:javascript复制
$ datafaker rdb mysql mysqldb://root:root@localhost:3600/test?charset=utf8 stu 10  --meta meta.txtCopy

则将直接写入mysql中

若要再次运行,需要修改meta.txt文件中为id[:inc(id,11)]起始值为11或更大值,不然数据库会报主键重复错误。

构造规则优先级:

解析器将优先选择第三列的带规则标记的字段注释进行解析,如果不带标记,则选择第二列的字段类型进行解析。

这种好处是:

1)对应已经创建的数据表,用户可以用desc tablename 或者show full columns from tablename,将表shema查询复制下来,对用字段类型构造数据不满足的情况下,在注释里面进行打标机进行特殊处理

2)对于新表,在create table创建表时直接在注释里面打上标记。这种情况不用指定元数据文件。

写hive:产生1000条数据写入hive的test库,stu表中

其中yarn为用户名,需要hive版本支持acid,不然请生成本地文件,然后上传到hdfs

代码语言:javascript复制
datafaker hive hive://yarn@localhost:10000/test stu 1000 --meta data/hive_meta.txt

写文件:产生10条json格式数据写入到/home目录out.txt中

代码语言:javascript复制
datafaker file /home out.txt 10 --meta meta.txt --format jsonCopy

写kafka:从本地meta.txt参数数据,以1秒间隔输出到kafka的topic hello中

代码语言:javascript复制
$ datafaker kafka localhost:9092 hello 1 --meta meta.txt --interval 1
{"school": "u4ebau548cu4e2du5fc3", "name": "u5218u91d1u51e4", "ip": "192.20.103.235", "age": 9, "email": "chaokang@gang.cn", "phone": "13256316424", "score": 3.45, "address": "u5e7fu4e1cu7701u5b81u5fb7u5e02u6d54u9633u5468u8defuu5ea7 990262", "class_num": 24, "nickname": "u9017u6bd4", "id": 1}
{"school": "u4ebau548cu4e2du5fc3", "name": "u6768u4e3d", "ip": "101.129.18.230", "age": 3, "email": "min60@hv.net", "phone": "18183286767", "score": 22.16, "address": "u8fbdu5b81u7701u592au539fu5e02u53cbu597du6c55u5c3eu8defGu5ea7 382777", "class_num": 30, "nickname": "u6b4cu795e", "id": 2}
{"school": "u6e05u534eu4e2du5b66", "name": "u8d75u7ea2", "ip": "192.0.3.34", "age": 9, "email": "fxiao@gmail.com", "phone": "18002235094", "score": 48.32, "address": "u5e7fu897fu58eeu65cfu81eau6cbbu533au65edu5e02u6c88u5317u65b0u6731u8defcu5ea7 684262", "class_num": 63, "nickname": "u6b4cu795e", "id": 3}
{"school": "u6e05u534eu4e2du5b66", "name": "u5f20u7389u6885", "ip": "198.20.50.222", "age": 3, "email": "xiulanlei@cw.net", "phone": "15518698519", "score": 85.96, "address": "u5b81u590fu56deu65cfu81eau6cbbu533au6d69u53bfu767du4e91u4e4cu9c81u6728u9f50u8857su5ea7 184967", "class_num": 18, "nickname": "u9017u6bd4", "id": 4}
{"school": "u732au573a", "name": "u674eu6842u5170", "ip": "192.52.195.184", "age": 8, "email": "fxiao@konggu.cn", "phone": "18051928254", "score": 97.87, "address": "u9ed1u9f8du6c5fu7701u54c8u5c14u6ee8u53bfu6c38u5dddu6d2au8857Eu5ea7 335135", "class_num": 46, "nickname": "u9ad8u5c0fu738bu5b50", "id": 5}
{"school": "u4ebau548cu4e2du5fc3", "name": "u5434u60f3", "ip": "192.42.234.178", "age": 3, "email": "uliang@yahoo.com", "phone": "14560810465", "score": 6.32, "address": "u5b81u590fu56deu65cfu81eau6cbbu533au516du76d8u6c34u5e02u5357u6eaau7f57u8857Mu5ea7 852408", "class_num": 12, "nickname": "u9b3cu6ce3", "id": 6}
^Cgenerated records : 6
insert records : 6
time used: 6.285 s

消费端验证:

json嵌套或任意数据结构(可不是jon)

代码语言:javascript复制
datafaker kafka localhost:9092 hello 10 --metaj meta.txtCopy

请使用–metaj指定元数据文件meta.txt:

代码语言:javascript复制
{
    "name": [:name],
    "age": [:age],
    "school": {
        "sch_name": [:enum(file://../data/names.txt)],
        "sch_address": [:address],
        "scores": [
            {
                "class": [:enum(Math, English)],
                "score": [:decimal(4,2,1)]
            },
            {
                "class": [:enum(Chinese, Computer)],
                "score": [:decimal(4,2,1)]
            }
        ]
    }
}

datafaker会替换meta.txt内容中带标记的字符串,并保留原格式,包括tab和空格,产生如下结果:

代码语言:javascript复制
{
    "name": 驷俊,
    "age": 95,
    "school": {
        "sch_name": 旧大院,
        "sch_address": 湖北省济南市上街宁德路I座 557270,
        "scores": [
            {
                "class": Math,
                "score": 83.28
            },
            {
                "class": Computer,
                "score": 52.37
            }
        ]
    }
}

如果要使用正确格式的json,将元数据文件内容压缩

代码语言:javascript复制
{"name":[:name],"age":[:age],"school":{"sch_name":[:enum(file://../data/names.txt)],"sch_address":[:address],"scores":[{"class":[:enum(Math,English)],"score":[:decimal(4,2,1)]},{"class":[:enum(Chinese,Computer)],"score":[:decimal(4,2,1)]}]}}

写hbase

代码语言:javascript复制
datafaker hbase localhost:9090 test-table 10 --meta data/hbase.txt

需要开启hbase thrift服务,不能为thrift2

例子中,创建一张表test-table, 列族为Cf

元数据文件hbase.txt内容为

代码语言:javascript复制
rowkey||varchar(20)||sdflll
Cf:name||varchar(20)||学生名字
Cf:age||int||学生年龄[:age]

其中第一行必须为rowkey, 可带参数,rowkey(0,1,4)表示将rowkey值和后面第一列,第五列值用_连接

后面行为列族中的列名,可以创建多个列族

写入ES

代码语言:javascript复制
datafaker es localhost:9200 example1/tp1 100 --auth elastic:elastic --meta meta.txt

其中localhost:9200为es的连接方式,多个host用逗号分隔。如host1:9200,host2:9200

example1/tp1为index和type,以/分隔

elastic:elastic为账号和密码,若没有,则可不带该参数

数据写入oracle

代码语言:javascript复制
datafaker rdb oracle://root:root@127.0.0.1:1521/helowin stu 10 --meta meta.txt

sqlalchemy连接串必须为oracle:形式

本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://cloud.tencent.com/developer/article/1936345

0 人点赞