1.Hive导出数据有几种方式?如何导出数据

  答:主要有4种方式。

  (1)insert方式:

     1)将查询的结果(格式化)导出到本地:

insert overwrite local directory '/opt/bigdata/export/student'
   row format delimited fields terminated by ','
   select * from student;

    2)将查询的结果导出到HDFS上:

 insert overwrite directory '/export/student' 
 row format delimited fields terminated by ','
 select * from student;

  (2)Hadoop命令导出到本地

hdfs dfs -get hdfs路径 本地路径
 hdfs dfs -get /user/hive/warehouse/student/student.txt /opt/bigdata/data

  (3)Hive Shell 命令导出   

1)hive -e "sql语句" > file
     bin/hive -e 'select * from default.student;' > /opt/bigdata/data/student1.txt
     2)hive -f sql文件 > file
     bin/hive -f '/user/hive/warehouse/student/student.txt' > /opt/bigdata/data/student1.txt

  (4)export导出到HDFS上

export table default.student to '/user/hive/warehouse/export/student1';

2.将一个表的数据按照指定的分隔符(@)导出成一个文件。

答:

insert overwrite local directory '/opt/bigdata/export/student'
row format delimited fields terminated by '@'
select * from student;



3.分区和分桶的区别

  答:分区表: 原来的一个大表存储的时候分成不同的数据目录进行存储。

  分桶表: 将hive中的一张表的数据进行归纳分类,分类规则是hashpartitioner(需要指定分桶字段,指定分成多少桶)。在hdfs中表现为同一个表目录或者分区目录下根据某个字段的值进行Hash散列之后的多个文件,分桶的表现形式就是一个单独的文件。

  区别:

  分区在HDFS上的表现形式是一个目录,分桶是一个单独的文件

  分区:细化数据管理,直接读对应目录,缩小mapreduce程序要扫描的数据量

  分桶:1.提高join查询的效率(用分桶字段做连接字段)

    2.提高采样的效率

4.将数据直接上传到分区目录(hdfs)上,让分区表和数据产生关联有哪些方式?

  答:

  (1)load方式(推荐方式)

load data [local] inpath "数据路径" into table table_name partition(分区字段)

   使用load加载数据会自动创建分区的,这样加载的数据就会和分区表进行关联,之后select就可以了

  (2)修复命令

  先使用hive创建分区目录,然后用put上传数据,最后使用msck repair进行修复,所谓修复实质是创建分区,即Added partition to metastore ...

dfs -mkdir -p "分区路径"
 dfs -put "数据路径" "分区路径"

   最后修复:

msck repair table table_name

  (3)上传数据后使用alter增加分区

dfs -mkdir -p "分区路径"
 dfs -put "数据路径" "分区路径"
 alter table table_name add partition(xxx)

5.桶表是否可以通过直接load将数据导入?

  答:桶表不能通过load的方式直接加载数据,只能从另一张表中插入数据 。

  流程:

  (1)创建桶表

create table user_buckets_demo(id int, name string) clustered by(id) into 4 buckets row format delimited fields terminated by '\t';

  (2)创建中间过渡表并为其加载数据

create table user_demo(id int, name string) row format delimited fields terminated by '\t';

  将数据加载到普通表中:

load data local inpath '/opt/bigdata/data/buckets.txt' into table user_demo;

  (3)加载数据到桶表user_buckets_demo中


insert into table user_buckets_demo select * from user_demo;



6.hive中分区可以提高查询效率,分区是否越多越好,为什么?

  答:不是越多越好。

  原因:

  (1)当分区过多且数据很大时,可以使用严格模式,避免出发一个大的mapreduce任务。当分区数量过多且数据量较大时,执行宽范围的数据扫描会触发一个很大的mapreduce任务。在严格模式下,当where中没有分区过滤条件时会禁止执行。

  (2)hive如果有过多的分区,由于底层是存储在HDFS上,HDFS上只用于存储大文件 而非小文件,因为过多的分区会增加namenode的负担。

  (3)hive会转化为mapreduce,mapreduce会转化为多个task。过多小文件的话,每个文件一个task,每个task一个JVM实例,JVM的开启与销毁会降低系统效率。

  注意:合理的分区不应该有过多的分区和文件目录,并且每个目录下的文件应该足够大。