hive学习-问题解答二

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的开启与销毁会降低系统效率。

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

posted @ 2019-08-14 12:06  小码农成长记  阅读(196)  评论(0)    收藏  举报