Hive进阶篇(二)基本操作--根据日志建表+常用命令(含汇总)
一、启动Hive(CDH集群的)
参考:
二、上传日志文件
上传到HDFS上的/user/hive/warehouse/目录下
首先创建一个目录:
[root@cdh ~]# hdfs dfs -mkdir /user/hive/warehouse/original_access_logs-0104
然后将将日志文件上传到该目录下:
[root@cdh ~]# hdfs dfs -put access.log /user/hive/warehouse/original_access_logs-0104
三、虚拟机进入Hive命令行beeline
[root@cdh alternatives]# beeline -u jdbc:hive2://localhost:10000 -n hive -p hive
-u :传Hive JDBC的地址(hive2是数据库的类型,服务器地址-localhost主机名:10000是hive的默认端口号)
-n :用户名(hive就是最大权限的用户)
-p :密码
如果没有什么认证的话就直接用户名是hive,密码也是hive
如果连错了,可以按输入 !q 退出。
四、根据日志建表
对应于日志文件建立Hive外部表-EXTERNAL
里面的正则表达式根据文件格式进行修改,基本上不用自己写,到网上查询即可。正常工作中多数情况下也不需要自己写。
注:LOCATION后面跟的是要插入的数据的地址, 对应的路径必须存在,否则创建出来的就是一个空的文件夹。
DROP TABLE IF EXISTS original_access_logs;
CREATE EXTERNAL TABLE original_access_logs (
ip STRING,
request_time STRING,
method STRING,
url STRING,
http_version STRING,
code1 STRING,
code2 STRING,
dash STRING,
user_agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex' = '([^ ]*) - - \\[([^\\]]*)\\] "([^\ ]*) ([^\ ]*) ([^\ ]*)" (\\d*) (\\d*) "([^"]*)" "([^"]*)"',
'output.format.string' = "%1$$s %2$$s %3$$s %4$$s %5$$s %6$$s %7$$s %8$$s %9$$s")
LOCATION '/user/hive/warehouse/original_access_logs-0104';
注意:'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'是引用的一个类Hive的话需要加载这个包contrib,
命令如下(注意区分CDH的版本,上面的是CDH6的,下面的是针对CDH5的):
ADD JAR /opt/cloudera/parcels/CDH/lib/hive/contrib/hive-contrib-2.1.1-cdh6.3.2.jar
ADD JAR /opt/cloudera/parcels/CDH/lib/hive/lib/hive-contrib.jar;
注意:安装的jar包的权限要和登陆beeline时的用户一致,不然创建表格会失败。
就是说,这里的jar包权限是root,那么登陆的时候是这样的:[root@cdh ~]。
五、常用命令
1、查询所有的数据库:show databases;
2、查询当前数据库下所有的表:show tables;
3、切换/使用特定的数据库:use + 数据库名;
4、创建数据库:create database + 数据库名;
5、删除数据库:drop database + 数据库名;
内部表的话采用上面的命令行可以实现彻底删除;
如果是外部表,仅drop的话只能删掉表的结构,数据依然在HDFS上。
如果想彻底删掉外部表,需要在drop前先执行命令:ALTER TABLE xxx SET TBLPROPERTIES('EXTERNAL'='False');
6、查看表中有哪些字段:desc + 表名;
查看更详细的表字段信息:desc extended / formatted + 表名; (这里formatted格式上会更规整好看)
7、查看建表语句:show create table + 表名;
(可能会加入些其他的字段)
8、查询表中指定条数的内容:select * from + 表名 + limit +查询的条数;
limit不会用到MR,它只是读取表数据然后用正则表达式选出指定条数的内同
9、查询表一共有多少行:select count(*) from + 表名;
count会用到MR,需要计算行数的。
打印出的日志会较多,如果执行较慢也可以进入可视化界面进行跟踪。
10、汇总概要: