hive中历史数据载入

需求:历史数据是直接发送到hdfs,目录为:/userftp/文件名/分区名/数据文件。需要的操作为,将这些数据导入到hive中ods层对应的表中,但是对方发过来的数据文件的分隔符与本系统表不符,所以采用的创建临时表的方式。
1.创建临时表

create table buffer.tmp_a(
  aaa string,
  bbb string,
  ccc string
)
comment '测试a表'
--分区字段与对方的分区名保持一致,要不然到后面你还得修改文件名
partition by (etl_dt string)
--分隔符与对方数据的分隔符一致
row format delimited fields terminated by '|'
--指定表数据的地址,与数据文件地址保持一致
location '/userftp/文件名';

2.修复表结构
msck repair table buffer.tmp_a
此时,查询表的时候,里面就应该有数据了
注:如果没有数据,很可能就是你创建临时表的分区字段的名称和hdfs上的分区名称对不上导致的

创建临时表的分区字段是etl_dt
那么hdfs对应的文件夹的名称应该是etl_dt=某个日期,如果hdfs上分区名称不是etl_dt=某个日期,那么需要去修改hdfs上的文件名,然后再重新执行一下msck repair table buffer.tmp_a命令

3.将临时表中的数据导入到目标表ods.a
beeline -u “jdbc:hive2://10.7.48.110:10000/;principal=hive/z4.idss.com@W3.COM” -e " sql语句 "

--开启动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert into table ods.a partition(etl_date)--目标表的分区字段
select * from buffer.tmp_a
--只导入8月份的数据,etl_dt是临时表的分区字段名称
where datediff(etl_dt,20210801)>=0 and datediff(etl_dt,20210831)<=0;
;
--开启自动分区的时候,查询的表字段应该比目标表多一个字段,自动分区的字段应该放在最后,
--因为hive默认最后一个字段为分区字段
--这里为什么直接用select * 就可以,是因为,我们查询表buffer.tmp_a是分区表,
--当select * 的时候,会把分区字段一块查询出来,而插入目标表的时候,是不会带分区字段的
--正好比目标表多一个字段,而且最后一个字段也正好是分区字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值