apache配置单元:加载数据与插入覆盖输出文件大小

myss37ts  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(315)

我正在使用ApacheHive,我不明白如果使用insert overwrite vs load加载数据,为什么表的大小会加倍。下面是问题的说明:
我在azzure中创建了一个表项,该表项加载了item.dat(大约28mb)中的数据,但实际情况是,item.dat文件将被移动到hive/warehouse中,并且大小保持不变
现在,如果我创建另一个与item相同的表item2,然后使用以下命令将数据从item加载到item2:

INSERT OVERWRITE TABLE item2
SELECT * FROM item

表item2的大小是item的两倍(约55mb)
为什么会这样?有什么办法可以避免吗?
附:这只是为了说明问题。实际上,我对预联接表很感兴趣,但是insert overwrite大大增加了联接表的大小(实际问题:用28mb联接的4gb会得到18gb)

jgwigjjp

jgwigjjp1#

可能表项的存储被压缩了,您可以使用“insert overwrite”将表项的数据压下,然后将压下的数据插入表项2中。

rggaifut

rggaifut2#

解开迷雾:)
这个问题是由于表中的某些字段的类型是char造成的。
使用insert overwrite填充表时,对于char(50)类型的所有字段,即使值小于50,它也会自动添加空字符以填充为char数据类型保留的整个空间。这就是char和varchar的主要区别。后者将根据存储的值占用可变的空间量。但另一个问题是为什么在使用load时不会发生这种情况
但是,至少我知道为什么会发生这种情况,并通过将char改为varchar数据类型来避免这种情况……所以请注意数据类型;)

相关问题