我正在使用Apache Hive,我不明白为什么如果我使用INSERT OVERWRITE vs LOAD加载数据,表的大小会翻倍。以下是该问题的说明:
我创建了一个表项 从item.dat加载数据(aprox 28MB) 在Azzure中发生的事情是文件item.dat将被移动到hive / warehouse并且当然大小保持不变
现在,如果我创建另一个表item2与item相同,然后使用以下命令将数据从item加载到item2:
INSERT OVERWRITE TABLE item2
SELECT * FROM item
表item2的大小是item的两倍(aprox 55MB)
为什么会这样?有没有办法避免它?
PS。这只是为了说明问题。在实践中,我对预加入表感兴趣,但INSERT OVERWRITE大大增加了连接表的大小(实际问题:4GB加入28MB,提供18GB)
答案 0 :(得分:2)
解决了这个错误:)
问题是由表的某些字段创建的,类型为char。
当使用INSERT OVERWRITE填充表时,对于char(50)类型的所有字段,即使值小于50,它也会自动添加空字符以填充为char数据类型保留的整个空间。这实际上是char和varchar之间的主要区别。后者将根据存储的值占用可变的空间量。但另一个问题是,为什么在使用LOAD时不会发生这种情况
但是,至少我知道它为什么会发生并设法通过将char更改为varchar数据类型来避免它...所以要注意数据类型;)
答案 1 :(得分:0)
表格项目的存储可能已压缩,您使用" insert overwrite" 按下项的数据,然后将按下的数据插入表项2中。