几种常用的方法---------------------------------------------------------
load data local inpath '/home/hadoop/userinfodata.txt' overwrite into table user_info;
create table if not exists db1.user_info2(
id int comment "this is userid",
name string
)
row format delimited fields terminated by ' '
lines terminated by '\n'
stored as textfile --存储格式
location '/user/hive/warehouse/db1.db/user_info' --只能是hdfs中的目录,直接为表加载数据
;
hadoop fs -put userinfodata /user/hive/warehouse/db1.db/user_info2;
load data local inpath '/home/hadoop/actionlog.txt' overwrite into table user_action_log
PARTITION (dt='2019-09-09');
在严格模式下必须指定分区,也可以直接put上去,没有问题
partition 是指定这批数据放入分区2019-09-09中。
------先创建普通临时表
create table user_leads_tmp
(
leads_id string,
user_id string,
user_id string,
user_phone string,
user_name string,
create_time string
)
row format delimited fields terminated by ','
stored as textfile;
------数据载入临时表
load data local inpath '/home/hadoop/lead.txt' overwrite into table user_leads_tmp;
------导入分桶表
set hive.enforce.bucketing = true;
insert overwrite table user_leads select * from user_leads_tmp;
set hive.enforce.bucketing = true;
这个配置非常关键,为true就是设置为启用分桶。
–导出数据,是将hive表中的数据导出到本地文件中。
insert overwrite local directory '/home/hadoop/user_info.bak2016-08-22 '
select * from user_info;
去掉local关键字,也可以导出到HDFS上。
insert select 语句
上一节分桶表数据导入,用到从user_leads_tmp表向user_leads表中导入数据,用到了insert数据。
insert overwrite table user_leads select * from user_leads_tmp;
这里是将查询结果导入到表中,overwrite关键字是覆盖目标表中的原来数据。如果缺省,就是追加数据。
如果是插入数据的表是分区表,那么就如下所示:
insert overwrite table user_leads PARTITION (dt='2017-05-26')
select * from user_leads_tmp;
一次遍历多次插入
from user_action_log
insert overwrite table log1 select companyid,originalstring where companyid='100006'
insert overwrite table log2 select companyid,originalstring where companyid='10002'
每次hive查询,都会将数据集整个遍历一遍。当查询结果会插入多个表中时,可以采用以上语法,将一次遍历写入多个表,以达到提高效率的目的。
复制表是将源表的结构和数据复制并创建为一个新表,复制过程中,可以对数据进行筛选,列可以进行删减。
create table user_leads_bak
row format delimited fields terminated by '\t'
stored as textfile
as
select leads_id,user_id,'2019-08-22' as bakdate
from user_leads
where create_time<'2019-08-22';
上面这个例子是对user_leads表进行复制备份,复制时筛选了2019-08-22以前的数据,减少几个列,并添加了一个bakdate列。
克隆表时会克隆源表的所有元数据信息,但是不会复制源表的数据。
–克隆表user_leads,创建新表user_leads_like
create table user_leads_like like user_leads;
备份是将表的元数据和数据都导出到HDFS上。
export table user_action_log partition (dt='2016-08-19')
to '/user/hive/action_log.export'
这个例子是将user_action_log表中的一个分区,备份到HDFS上,to后面的路径是HDFS上的路径。
将备份在HDFS上的文件,还原到user_action_log_like表中。
import table user_action_log_like from '/user/hive/action_log.export';