在HIVE QL中的表中添加一列

33

我正在使用HIVE编写代码,创建一个由1300行和6列组成的表:

create table test1 as SELECT cd_screen_function,
     SUM(access_count) AS max_count,
     MIN(response_time_min) as response_time_min,
     AVG(response_time_avg) as response_time_avg,
     MAX(response_time_max) as response_time_max,
     SUM(response_time_tot) as response_time_tot,
     COUNT(*) as row_count
     FROM sheet WHERE  ts_update BETWEEN unix_timestamp('2012-11-01 00:00:00') AND 
     unix_timestamp('2012-11-30 00:00:00') and cd_office = '016'
     GROUP BY cd_screen_function ORDER BY max_count DESC, cd_screen_function;

现在我想要添加另一列名为access_count1的列,这一列在所有1300行中只有一个唯一的值,该值将是max_count列的sum(max_count)的结果。max_count是我现有表格中的一列。我该怎么做? 我正在尝试使用以下代码来修改表格:ALTER TABLE test1 ADD COLUMNS (access_count1 int) set default sum(max_count);

1个回答

53

无法在Hive中添加默认值列。您已经使用了正确的语法添加列ALTER TABLE test1 ADD COLUMNS (access_count1 int);,您只需要摆脱default sum(max_count)即可。添加该列不会导致支持表的文件发生任何更改。Hive通过将NULL解释为该列中每个单元格的值来处理“缺失”的数据

现在您需要填充该列的问题。不幸的是,在Hive中,您基本上需要重新编写整个表,这次要填充该列。使用新列重新运行原始查询可能更容易。或者,您可以将该列添加到当前表中,然后选择其所有列以及新列的值。

你也可以选择始终使用COALESCE将列合并到所需的默认值,并暂时将其保留为NULL。当你希望NULL具有与所需默认值不同的含义时,此选项会失败。它还要求你依赖于始终记得使用COALESCE
如果你非常自信能够处理支持Hive的文件,你也可以直接更改它们以添加你的默认值。一般来说,我建议不要这样做,因为大多数情况下它会更慢、更危险。可能有一些情况是有意义的,因此我为完整性包括了这个选项。

如果我想添加多个列,这个如何操作? - Arun
14
修改表test1,添加列(access_count1 int, access_count2 date, access_count3 string, ...)。 - Ankit Malhotra
我们添加列的顺序很重要吗? - Balaji Boggaram Ramanarayan
除非您计划直接编辑支持您的数据的文件(不建议这样做),否则列顺序并不重要。 - Daniel Koverman
1
假设我有100万条记录集,如果我添加列,Hive QL是否需要更多的性能和时间?因为MySQL需要更多的时间和性能来实现这一点。另外,如果我在Hive表中使用分区列会发生什么? - ǨÅVËĔŊ RĀǞĴĄŅ
这可能会有所帮助 https://dev59.com/6orda4cB1Zd3GeqPMnWj#30051042 - Sida Zhou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接