如何往Hive里面造测试数据?

在做*****这个项目的大半年时间了,由于我写的spark程序需要到Hive表读数据,而开发环境的Hive表里面没有数据,需要自己造,
所以开发和测试环境用到的Hive的测试数据基本上都是我造的。下面是我总结的一些经验

刚开始的时候Hive里面有13张标签表,总共1700多个字段,在开发测试环境不需要用完所有的13张表,没必要,我只往三张表里造数据,平时测试的时候也只
测这三张表,太多了容易乱,但是这三张表包含了一张特殊的用户基本信息表,这张表示必须要有的。

往Hive里插入数据一共有6种方式,这里最适合的一种还是通过load关键字加载的方式。
由于Hive不能像mysql那样通过这样的sql语句插入数据:insert into table_name (col1,col2,…) values (val1,val2,…),
即往Hive插入数据的时候不能指定每个字段的顺序,也不能只插入部分的字段,其他的字段为默认值,所以往Hive造数据的时候,就算
Hive表有几百个字段也要全部有值,我是这样造数据的:
先在hive的命令行窗口,用desc table_name 命令查看表结构,再在idea开发工具里面新建一个文本文件,将刚才查到的表结构复制粘贴到新建的表结构里面。
大概是长下面的样子:
uid string 用户id
bbk string 二级分行号

1.将表机构文件用文件工具读出来;
2.然写一个方法,方法里面写一个循环,循环的次数就是要造的数据的条数
读出表结构文件的第一个字段的字段类型,如果是int类型,就造int类型的数字,如果是string类型就造string类型的数据,一般情况下我造的字段的值是字段类型后面加一个数字,
如果是int类型我就造1到100的整数,如果是decimal(18,2)的类型就造带有两位小数的数字,以此类推。
当然如果有些字段根据需要可以特殊处理,比如说bbk这个字段我只需要造121/122/755/752就可以,我就在前面线判断字段名,如果字段名等于bbk那我就特殊处理。
3.把该表的一条记录所有字段的取值拼成一个字符串,每个字段的取值中间用一个分隔符分割,可以用“|”或者“,”;
4.每个循环一条记录,把所有的记录都拼成一个大的字符串,然后将这个大的字符串写到一个文件中去,文件名我一般习惯明明为表明,比较好识别。
5.由于hive里面的大多数为分区字段,我是通过动态分区的方式导入数据到hive的,而动态分区导入数据到hive,需要多建立一张临时表,临时表的表名我习惯命名为原来的表名
后面接“_tmp”,tmp表需要跟原表的字段完全一样,并且把原来的分区字段改成普通字段,我是这样建tmp表的,create table_name_tmp as select * from table_name;
然后再show create table table_name_tmp;把建表语句粘贴出来,改一下存放格式,再drop table table_name_tmp; 然后重新建临时表;
6.建完临时表后就可以把刚才生成的数据文件上传到hdfs上了,然后再打开hive窗口,先设置是否允许动态分区模式的参数为true(默认就为true),
然后设置非严格模式(默认不允许非严格模式),即以下两行代码:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode = nonstrict;
然后把hdfs的文件导入到tmp表,再通过动态分区的方式导入到目标表;
如果临时表里有数据要删掉可以使用覆盖的方式导入,如果覆盖的方式不好使,也可以使用truncate table table_name;语句来清空表的数据;
完成!

如果是其他的表,每一个字段都比较特殊,没有几百个字段那么多的表,就可以不根据数据类型造测试数据,可以定制每一个字段的取值。

在做这个项目中,有些数据是从TD数据库导入到hive里面的,由于如果hive里面不能建立主键,二TD库的数据是业务数据是有主键的,这个时候在造数据的时候要判断一下,如有两
条记录的主键上的所有字段一样,那就跳过第二条记录。

发布了29 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/shuoyuechenxing/article/details/104993942