Hive Shell

版权声明:原创文章,欢迎转载,转载请注明出处 https://blog.csdn.net/zhangshenghang/article/details/84317449

目录

 

hive是否执行mr

执行命令不进入hive交互模式

hive关联hbase表

创建外部表

创建内部表

外部执行

清空表中所有行数据

导入数据

1.将文件放入表目录下

2.导入本地文件直接导入表中

3.导入hdfs上数据到表中

4.从别的表中查询插入相应的表

5.在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中

UDF


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交互模式

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';

创建内部表

create  TABLE u_info
(
    usrid STRING,
    age STRING,
    sex STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LINES TERMINATED BY '\n';

外部执行

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        [email protected]     ztc
7979008 GX303YY200XLWW014       中国人民解放军第三0三医院
  • 不使用函数结果
704512  bj-华龙达       北京市华龙达商贸公司
2457600 nnzqd   南宁市百花谷文化传播有限公司
21889024        [email protected]     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 tableName2
   SELECT column1,colum2 
     GROUP BY year
INSERT OVERWRITE TABLE tableName3
   SELECT column1,count(1)
     WHERE column2 = 100
  • CTAS(CREATE TABLE... AS SELECT) 把查询到的结果创建一个新表保存起来,原子性操作,查询失败表不会被创建
CREATE TABLE tableName
AS
SELECT column1,column2
FROM tableName2

猜你喜欢

转载自blog.csdn.net/zhangshenghang/article/details/84317449