目录
hive是否执行mr
创建数据库指定目录
删除数据库
显示表信息/表结构
查看表示内部表还是外部表
拷贝一张已经存在的表的表模式(而无需拷贝数据)
复制一张表(包括数据)
hive-cli 显示当前所在数据库
执行命令不进入hive交互模式
hive关联hbase表
创建外部表
查询数据保存到linux系统
创建内部表
创建parquet格式snappy压缩表
外部执行
清空表中所有行数据
导入数据
1.将文件放入表目录下
2.导入本地文件直接导入表中
3.导入hdfs上数据到表中
4.从别的表中查询插入相应的表
5.在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
UDF
Hive执行引擎设置
Hive指定yarn队列
多表插入
Hive手动创建目录导入数据,表刷新partition
hive是否执行mr
简单的查询,就是只是select,不带count,sum,group by这样的,都不走map/reduce,直接读取hdfs文件进行filter过滤。这样做的好处就是不新开mr任务,执行效率要提高不少,但是不好的地方就是用户界面不友好,有时候数据量大还是要等很长时间,但是又没有任何返回。
改这个很简单,在hive-site.xml里面有个配置参数叫
hive.fetch.task.conversion
将这个参数设置为more,简单查询就不走map/reduce了,设置为minimal,就任何简单select都会走map/reduce
创建数据库指定目录
hive> CREATE DATABASE financials> LOCATION '/my/preferred/directory'> COMMENT 'Holds all financial tables'
删除数据库
hive> DROP DATABASE IF EXISTS financialsIF EXISTS子句是可选的,如果加了这个子句,就可以避免因数据库finanacials不存在而抛出警告信息默认情况下,Hive是不允许用户删除一个包含有表的数据库的。用户要么先删除数据库中的表,然后再删除数据库;要么在删除命令的最后面加上关键字CASCADE,这样可以使Hive自行先删除数据库中的表:hive> DROP DATABASE IF EXISTS financials CASCADE
显示表信息/表结构
hive > DESCRIBE FORMATTED mydb.tableNameFORMATTED 详细表结构
查看表示内部表还是外部表
hive> DESCRIBE extended crawler_hive2;
内部表: tableType:MANAGED_TABLE
外部表:ableType:EXTERNAL_TABLE
拷贝一张已经存在的表的表模式(而无需拷贝数据)
CREATE TABLE IF NOT EXISTS mydb.employees2
LIKE mydb.employees
LOCATION 'xxxx/xxx/xxx'
复制一张表(包括数据)
create table t_copy as select * from t_temp;
hive-cli 显示当前所在数据库
hive> set hive.cli.print.current.db=true;
hive (ods_database)>取消显示
set hive.cli.print.current.db=false;
执行命令不进入hive交互模式
hive -e "SQL" 执行单条语句
hive -f /home/root/insert.sql 执行sql文件,适合多条语句
hive关联hbase表
hive集成hbase:
hive 0.13版本 hbase1.2.5版本无法创建hive创建内部表关联,提示找不到方法,hive更新到2.1.1版本就可以了
- hive创建外部表关联(可以关联hbase已有的表)
CREATE EXTERNAL TABLE hive_high_keyword(key string, keyword string, adCode string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping"=":key,fn:keyword,fn:adCode" )TBLPROPERTIES("hbase.table.name" = "crawl:high_keyword");
- hive创建内部表关联(只能关联hbase中没有的表,删除hive表后hbase表也会删除,并且通过hive创建hbase的内部表,存储数据仍然存在hbse中)
CREATE TABLE biz0728(key string, name string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ( "hbase.columns.mapping"=":key,fn:name" )
TBLPROPERTIES("hbase.table.name" = "biz0728");
创建外部表
create EXTERNAL TABLE u_info
(usrid STRING,age STRING,sex STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n';
查询数据保存到linux系统
insert overwrite local directory '/home/xxx/xxx' select * from tableName;
创建内部表
create TABLE u_info
(usrid STRING,age STRING,sex STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n';
创建parquet格式snappy压缩表
CREATE EXTERNAL TABLE IF NOT EXISTS tableName(xxx string)
partitioned by
(pt_xvc string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
STORED AS PARQUET TBLPROPERTIES('parquet.compression'='SNAPPY');
外部执行
hive -f xxx.sql
清空表中所有行数据
truncate table tablename;
导入数据
1.将文件放入表目录下
- 表创建时会指定列分隔符(默认'\t')和行分隔符(默认'\n')
- 将数据以指定形式放入,hive在hdfs存储目录下
测试导入数据如下(a.txt里内容):
user1 27 1
user2 28 1
user3 29 0
user4 30 1
user5 31 0
user6 32 1
user7 33 1
user8 34 0
我 是 测试
外 部 表
- 步骤:
- 用上面创建表命令创建一个内部或者外部表
- 将a.txt里的内容导入到hdfs该表的目录下
- select * from u_info;即可查询到数据
- 如果有两个txt,查询时会合并到一起
2.导入本地文件直接导入表中
测试导入数据a.txt
load data local inpath 'a.txt' into table u_info;
- a.txt,文件路径默认是用户的根目录,如root用户,读取目录为/home/root/a.txt
- 推荐写绝对路径
load data local inpath '/home/root/a.txt' into table u_info;
- 在hive中可以直接查看hdfs上的数据,使用命令:
dfs -ls /user/hive/warehouse/xxx ;
3.导入hdfs上数据到表中
测试导入数据a.txt
load data inpath '/a.txt' into table u_info;
- 与2中的区别是少了一个 local
4.从别的表中查询插入相应的表
- 创建表 test 并且以age进行分区
create table testc(
id int, name string
,tel string,sdf string)
partitioned by
(age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
- 查询另一个表的数据并且插入到test表
insert into table test
partition (age='25')
select id, name, tel
from wyp;
这里做一下说明: 我们知道我们传统数据块的形式insert into table values(字段1,字段2),这种形式hive是不支持的。
- 我们也可以在select语句里面通过使用分区值来动态指明分区:
set hive.exec.dynamic.partition.mode=nonstrict;
insert into table test
partition (age)
select id, name,
tel, age
from wyp;// partition (age),指定创建表时候的列
// partition跟select 中查询的列名无关,对应select查询最后一个列为test表中的age做partition(describe tablename 可以查看partition在哪个位置)
这种方法叫做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把hive.exec.dynamic.partition.mode设置为nonstrict
5.在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
- 在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:
create table test4
as
select id, name, tel
from wyp;
UDF
- UDFClass
public class Uppercase extends UDF
{
//参数列表可以使用多个参数public Text evaluate(Text s1){String retsult=s1.toString().toUpperCase();return new Text(retsult);}
}
maven引用
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.1</version></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.2.1</version></dependency>
- 在hive交互界面输入
//添加自己写入的jar包到hive中
add jar /home/root/udf.jar;
// 将自己写的类创建为函数,函数名为mytest
create temporary function mytest as 'com.xxx.hive.udf.Uppercase';
//查看所有可用函数,会发现自己刚刚添加的函数
show functions;
//使用udf函数查询
select mytest(u_info.age) from u_info;
- 使用函数查询后结果
704512 BJ-华龙达 北京市华龙达商贸公司
2457600 NNZQD 南宁市百花谷文化传播有限公司
21889024 LYYZC@Y.COM ztc
7979008 GX303YY200XLWW014 中国人民解放军第三0三医院
- 不使用函数结果
704512 bj-华龙达 北京市华龙达商贸公司
2457600 nnzqd 南宁市百花谷文化传播有限公司
21889024 lyyzc@y.com ztc
7979008 gx303yy200xlww014 中国人民解放军第三0三医院
- 使用hive -i 参数在进入hive时自动初始化
$ cat hive_init
add jar /home/root/udf.jar;
create temporary function mytest as 'com.xxx.hive.udf.Uppercase';
$ hive -i hive_init
//进入hive交互界面就可直接使用函数了
和前两者相比,第三种方式直接将用户的自定义函数作为注册为内置函数,未来使用起来非常简单,但这种方式也非常危险,一旦出错,将是灾难性的,因此,建议如果不是特别通用,并且固化下来的函数,还是使用前两种方式比较靠谱。
Hive执行引擎设置
set hive.execution.engine=mr;
Hive指定yarn队列
set mapred.job.queue.name=queue3;
多表插入
FROM tableName1
INSERT OVERWRITE TABLE tableName2SELECT column1,colum2 GROUP BY year
INSERT OVERWRITE TABLE tableName3SELECT column1,count(1)WHERE column2 = 100
- CTAS(CREATE TABLE... AS SELECT) 把查询到的结果创建一个新表保存起来,原子性操作,查询失败表不会被创建
CREATE TABLE tableName
AS
SELECT column1,column2
FROM tableName2
Hive手动创建目录导入数据,表刷新partition
alter table crawler_other_article_hive add partition(created_date=201801) location 'hdfs://xxx:8020/user/hive/warehouse/ods_crawler.db/crawler_other_article_hive/created_date=201801';删除表分区
ALTER TABLE testc DROP PARTITION (pt_date=20181212)