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的开启与销毁会降低系统效率。
注意:合理的分区不应该有过多的分区和文件目录,并且每个目录下的文件应该足够大。