<!--该参数主要指定Hive的数据存储目录--> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> <description>location of default database for the warehouse</description> </property> <!--该参数主要指定Hive的临时文件存储目录--> <property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description> </property>
# 登录到mysql # 在第一次开启mysql服务的时候,会自动生成一个随机的密码 [root@Slave2 ~]# grep password /var/log/mysqld.log 2022-05-12T14:01:44.512146Z 1 [Note] A temporary password is generated for root@localhost: aK8n4AQuV:J; # 使用这个随机密码登录到mysql [root@Slave2 ~]# mysql -u root -p
# 修改mysql的安全等级 # 1.修改mysql的密码策略(安全等级) # mysql默认的密码安全等级有点高,在设置密码的时候,必须同时包含大小写字母、数字、特殊字符,以及对位数有要求 show variables like '%validate_password%'; # 查看密码策略 set global validate_password_policy=LOW; # 修改密码策略等级为LOW set global validate_password_length=4; # 密码的最小长度 set global validate_password_mixed_case_count=0; # 至少要包含0个大写字母和小写字母 set global validate_password_number_count=0; # 至少要包含0个数字 set global validate_password_special_char_count=0; # 至少要包含0个特殊字符
#2.修改密码 alter user root@localhost identified by '123456';
#3.远程授权 grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
配置hive环境变量(在Slave1中操作)
1 2 3
[root@Slave1 ~]# cd /opt/module/hive [root@Slave1 hive]# cd conf [root@Slave1 conf]# vim hive-site.xml
<!--配置mysql的连接字符串--> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://Slave2:3306/hive?createDatabaseIfNotExist=true</value> <description> JDBC connect string for a JDBC metastore. To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL. For example, jdbc:postgresql://myhost/db?ssl=true for postgres database. </description> </property> <!--配置mysql的连接驱动--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <!--配置登录mysql的用户--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>Username to use against metastore database</description> </property>
<!--配置登录mysql的密码--> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>password to use against metastore database</description> </property>
hive> create database test1; hive> create database test1 if not exists test1; 之前存在就不创建 hive> create database test1 if not exists test1 comment 'this is a database of test1'; 添加描述
hive> drop database dbName; 只能删除空库 hive> drop database dbName cascade;
6)查看当前使用的库
1
hive> select current_database();
三、表操作语法
1)创建表
本质就是在对应的数据库目录下创建一个子目录,目录名为表名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
语法1:默认创建在当前使用的库 create table t_user(id int,name string); 语法2:使用库.表形式 create table mydb.t_user(id int,name string); 语法3:指定分隔规则形式 create table if not exists t_user( name string comment 'this is a name', chinese int, math int, english int ) comment 'this is my table' row format delimited fields terminated by '\t' 字段之间以什么做分隔 lines terminated by '\n' 行与行之间以什么做分隔 stored as textfile; 文件在hdfs上以什么形式存储
2)查看表
1 2
hive> show tables; hive> show tables in mydb; 可以指定查看某库里的表
- 修改表名 alter table oldTableName rename to newTableName; - 修改列名 alter table tableName change column oldName newName colType; alter table tableName change column colName colName colType; - 修改列的位置:注意2.x以后,必须是相同类型进行移动位置 # 注意:位置改变后,列对应的数据不会互换,相当于将两个列名进行替换而已(感觉有点无用了) # eg:英语 数学 替换后 数学 英语 60 100 60 100 alter table tableName change column colName colName colType after colName1; alter table talbeName change column colName colName colType first; - 增加字段 alter table talbeName add columns (sex int,...); - 删除字段:实际上是保留小括号内的字段 alter table tableName replace columns( id int, name int, size int, pic string );
5)删除表
1
drop table talbeName;
四、数据导入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[root@Master hive]# mkdir hivedata [root@Master hive]# cd hivedata [root@Master hivedata]# vi user.txt # 加入如下数据(不要空行、空格) 1,张三 2,李四 3,王五 create table t_user( id int, name string ) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;
load data [local] inpath '文件路径' [overwrite] into table 表名 参数说明: local 加载linux本地文件时加上,加载hdfs上的文件则不需要加,注意:上传本地文件相当于拷贝,而加载hdfs上的文件时,会移动原本文件到对应表目录中 overwrite 如不写,如果有重名文件,则追加 加载数据时: 1. 最好写绝对路径,从根路径开始 2. 也可以写相对路径,但是一定要记住登录hive时的位置,从当前位置写相对路径 3. ~在hive中,是相对路径的写法 4. 使用beeline工具进行远程登录(客户端与服务器不在同一机器)时,使用以下语句: load data local inpath '文件路径' [overwrite] into table 表名 会有一个大坑:local是指服务端的文件系统,而不是当前操作hive的客户端
方法3:从另一张表(也可称为备份表)中动态加载数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
insert into table tableName2 select [...] from talbeName1;
扩展内容:向多张表插入数据 from tableName1 insert into tableName2 select * insert into tableName3 select * where 条件 ... create table t_user2( id int, name string ) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;
insert into table t_user2 select * from t_user;
方法4:克隆表数据
1 2 3 4 5
- create table if not exists tableName2 as select [...] from tableName1; - create table if not exists tableNmae2 like tableName1 location 'tableName1存储目录的路径' # 新表不会产生自己的目录,因为用的是别的表路径
扩展内容:只复制表结构 create table if not exists tableName2 like tableName1;
create table flow( id string comment 'this is id column', phonenumber string, mac string, ip string, url string, urltype string, uppacket int, downpacket int, upflow int, downflow int, issuccess int ) comment 'this is log table' row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;
加载数据: load data local inpath '/opt/module/hive/hivedata/HTTP_234234234.dat' into table flow;
1. 统计每个电话号码的总流量(M) select l.phonenumber, round(sum(l.upflow + l.downflow) / 1024.0,2) as total from flow l group by l.url order by urlcount desc limit 3;
2. 求访问次数排名前三的url select l.url url, count(l.url) as urlcount from flow l group by l.url order by urlcount desc limit 3;