【Hive】(二十二)往 Hive 表中插入与导出数据方式load 、insert (3)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

总结:overwrite覆盖的原理,是先删除数据,然后再写入数据。如果开了trash回收站功能,可以在回收站查看到回收的数据。

三、通过查询insert …select的形式往hive中导入数据

使用insert子句将查询结果插入表中,这是开发中往表里导入数据最常用的方式之一,主要用来项目开发中使用,多表关联计算等操作。

1.通过查询将数据覆盖导入的分区表中(或者用into追加结果,往动态分区表中插入数据,请参考本系列其他博客。)
insert overwrite table fdm_sor.personinfo
partition(statis_date='${staits\_date}'
select a.id,a.name,b.address
from  person a left join address b
on a.id = b.id
 
2.多次插入,从一张表中读数据,下面这种方式效率最高,只需要扫描一次表即可。注意中间没有分号;
from T_DEDUCT_SIGN_D_external t
insert into table t1 
select 123 ,sign_no string,null
insert into table t2
select 345 ,null ,bp_no string
insert into table t3
select 678 ,sign_no string,bp_no string
where t.statis_date = '20180101';

注意:使用,insert…select 往表中导入数据时,查询的字段个数必须和目标的字段个数相同,不能多,也不能少,否则会报错。但是如果字段的类型不一致的话,则会使用null值填充,不会报错。而使用load data形式往hive表中装载数据时,则不会检查。如果字段多了则会丢弃,少了则会null值填充。同样如果字段类型不一致,也是使用null值填充。

四、使用create…as 语句往hive表里装载数据

hive (fdm_sor)> create table mytest_createas  
              > as select id ,name
                 from  mytest_tmp2_p
                where country='china' and city='beijing';
注意:使用create... as 创建的表,表的存储属性是默认的textfile,serde也是默认的lazyserde.同时表没有分区.如果对表的结构有要求,
比如我们公司sor要求使用rcfile存储,则不能使用create ..as创建表,并且加载数据。
2.如果多次操作需要取同一个表中数据,可以优化如下,将from放到最前面,这样只扫描一次表即可完成。
  from  tu_trade t
  insert overwrite table credit
       partition(statis_date='201805')
       select \*  where t.statis_date ='201805'
  insert overwrite table credit
    partition(statis_date='201804')
    select \*  where t.statis_date ='201804'
    .......
  insert overwrite table credit
    partition(statis_date='201704')
    select \*  where t.statis_date ='201704'

五、从hive表里导出数据到文件系统

不管数据在hive中如何存储,hive会将所有内容以字符串的形式序列化到文件里。但是要注意的是hive将数据序列化成文件的时候,文件的编码格式和hive里的一致。比如,hive中存储格式为sequencefile,则序列化的数据文件编码也是二进制格式,如果hive中列分隔符是默认的,则序列化文件也是默认的^A(不可视)的分隔符。所以为了序列化后文件可读性,一般要将需要导出的数据在hive中的编码格式改成textfile,分隔符比如为逗号等等(可以通过使用临时表)。注意导出数据只要insert overwrite没有insert into 所以很容易造成数据覆盖丢失。

1.使用insert …overwrite…directory方式导出数据到本地或者分布式文件系统上

标准语法格式:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
  [ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
  SELECT ... FROM ...
 
多次多出语法格式:
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...
 
案例演示:
hive (fdm_sor)> insert overwrite local directory '/home/robot/mydata/111' 
              > select \*  from mytest_tmp2_p where country='china';
注意:1.不加local则将数据导出到分布式文件系统上,比如hdfs.加了local则默认为本地,如linux上。
     2.overwrite会将目录下的内容覆盖掉,尤其是如果当前目录下有数据,会丢失。但是这里没有into的用法。
     3.如果导出的目录,不存在,则会重新创建。
     4.注意导出产生的文件个数取决于计算过程中reducers个数。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

acb)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值