Hive Shell 命令之二(表中数据的操作,出自Hive编程指南)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengzheku/article/details/50420745

一、 交互模式:

show tables; #查看所有表名

show tables  'ad*'  #查看以'ad'开头的表名
set 命令 #设置变量与查看变量;
set -v #查看所有的变量
set hive.stats.atomic #查看hive.stats.atomic变量
set hive.stats.atomic=false #设置hive.stats.atomic变量
dfs  -ls #查看hadoop所有文件路径
dfs  -ls /user/hive/warehouse/ #查看hive所有文件
dfs  -ls /user/hive/warehouse/ptest #查看ptest文件
source file <filepath> #在client里执行一个hive脚本文件
quit #退出交互式shell
exit #退出交互式shell
reset #重置配置为默认值
!ls #从Hive shell执行一个shell命令


二、插入导出数据

1、向表中插入数据:

1)如果是分区表,并且分区目录不存在的话,此命令会先创建分区目录,然后将数据拷贝到改路下:
load data local inpath '/data1/testdata' overwrite into table test01 partition (country = 'US', state = 'CA');

2)如果目标表是非分区表,就不需要partition了:
load data local inpath '/data1/testdata' overwrite into table test01;

关键字:LOCAL,使用LOCAL的话,路径是本地文件系统路径,数据将会拷贝到目标位置。如果省略掉LOCAL,路径就是分布式文件系统中的路径
关键字:OVERWRITE,如果使用此关键字,那么目标文件夹之前存在的数据将会被先删除掉,如果没有这个关键字,则仅仅会把新增的文件增加到目标文件中,而不会删除之前的数据。

2、通过查询语句向表中插入数据
   
   1)静态分区插入
    INSERT OVERWRITE TABLE test02 PARTITION(country = 'US', state = 'OR') SELECT * FROM test01 t WHERE t.country = 'US' AND t.state = 'OR';

   2)动态分区插入:
   INSERT OVERWRITE TABLE test02 PARTITION(country ,state) SELECT t.name,t.age,t.country,t.state FROM test01 t;
   Hive 根据select语句中的最后2列来确定分区字段country和state的值,是根据位置而不是根据字段的名字相同来区分不同分区的。

   3)混合使用静态分区和动态分区:
   I NSERT OVERWRITE TABLE test02 PARTITION(country = 'US', state) SELECT t.name,t.age,t.country,t.state FROM test01 t WHERE t.country = 'US';
   静态分区必须出现在动态分区键之前

   使用动态分区需要设置一些属性:
   set hive.exec.dynamic.partition=true; #设置成true,表示开启动态分区
   set hive.exec.dynamic.partition.mode=nonstrict;#设置成nonstrict,表示允许所有分区都是动态的,若是设置成strict,则至少有一个是静态分区

   set hive.exec..max.dynamic.partitions.pernode=1000;#每个mapper或reducer可以创建的最大动态分区个数。

  

3、创建表时插入数据:
   CREATE TABLE test4 AS SELECT * FROM test1;

4、导出数据
   1)直接从表所在的位置导出:
       hadoop fs -cp /user/hive/warehouse/test01 /data1/test

   2) 使用INSERT ...DIRECTORY...:
         INSERT OVERWRITE LOCAL DIRECTORY '/tmp/test' SELECT * FROM test;

猜你喜欢

转载自blog.csdn.net/fengzheku/article/details/50420745