分享

使用alter table add column 之后的数据问题

chyeers 发表于 2016-8-1 16:24:15 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 25925
本帖最后由 chyeers 于 2016-8-1 16:41 编辑

1.小明先建了一张表A,用来存日志文件的
2.小明又建了一张ORC格式的表B,用来压缩表A的(表A太大了,分区太多,先压缩成ORC,然后酌情删一些分区)
3.小东修改了表A,增加了一个字段
4.小明需要将表B也增加一个字段,于是
[mw_shl_code=sql,true]ALTER TABLE B ADD COLUMNS (new_col INT)[/mw_shl_code]
5.小明修改了压缩数据的语句
[mw_shl_code=sql,true]insert overwrite table B partition(request_date=20160717)
select col1,col2,new_col  from A where request_date=20160717;[/mw_shl_code]
6.修改后重跑了之前几天的数据,将增加的字段也压缩,一看,惨了,A表new_col是有值的,怎么B表的 new_col 就全是null呢?

已有(2)人评论

跳转到指定楼层
starrycheng 发表于 2016-8-1 18:25:13
一般一创建的时候就会采用压缩的方式。
楼主是导入另外一个表压缩的吗?
这个null,是否是不识别造成的。
是否因为不同类型造成的哪。

下面一些内容,楼主参考下,希望有帮助
文件压缩

  ORC文件使用两级压缩机制,首先将一个数据流使用流式编码器进行编码,然后使用一个可选的压缩器对数据流进行进一步压缩。
  一个column可能保存在一个或多个数据流中,可以将数据流划分为以下四种类型:
• Byte Stream
  字节流保存一系列的字节数据,不对数据进行编码。
• Run Length Byte Stream
  字节长度字节流保存一系列的字节数据,对于相同的字节,保存这个重复值以及该值在字节流中出现的位置。
• Integer Stream
  整形数据流保存一系列整形数据。可以对数据量进行字节长度编码以及delta编码。具体使用哪种编码方式需要根据整形流中的子序列模式来确定。
• Bit Field Stream
  比特流主要用来保存boolean值组成的序列,一个字节代表一个boolean值,在比特流的底层是用Run Length Byte Stream来实现的。
  接下来会以Integer和String类型的字段举例来说明。
(1)Integer
  对于一个整形字段,会同时使用一个比特流和整形流。比特流用于标识某个值是否为null,整形流用于保存该整形字段非空记录的整数值。
(2)String
  对于一个String类型字段,ORC writer在开始时会检查该字段值中不同的内容数占非空记录总数的百分比不超过0.8的话,就使用字典编码,字段值会保存在一个比特流,一个字节流及两个整形流中。比特流也是用于标识null值的,字节流用于存储字典值,一个整形流用于存储字典中每个词条的长度,另一个整形流用于记录字段值。
  如果不能用字典编码,ORC writer会知道这个字段的重复值太少,用字典编码效率不高,ORC writer会使用一个字节流保存String字段的值,然后用一个整形流来保存每个字段的字节长度。
  在ORC文件中,在各种数据流的底层,用户可以自选ZLIB, Snappy和LZO压缩方式对数据流进行压缩。编码器一般会将一个数据流压缩成一个个小的压缩单元,在目前的实现中,压缩单元的默认大小是256KB。




回复

使用道具 举报

chyeers 发表于 2016-10-11 09:40:27
已经解决。原表A是一个版本,修改后表B是另外一个版本。那么原版本的分区指向的就是原版本的A表,任凭你再怎么overwrite,都不会出现B表的字段。

所以你只能把需要修改的分区先删除,再insert overwrite。这样就会对于新版本B表的数据了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条