32

我正在 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 行的一个唯一值,值将是sum(max_count). max_count 是我现有表中的一列。我怎么能这样做?我正在尝试通过此代码更改表格ALTER TABLE test1 ADD COLUMNS (access_count1 int) set default sum(max_count);

4

1 回答 1

50

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

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

您还可以选择始终COALESCE将列设置为所需的默认值并暂时保留它NULLNULL当您希望具有与所需默认值不同的含义时,此选项会失败。它还要求您始终牢记于心COALESCE

如果您对处理支持 Hive 的文件的能力非常有信心,您也可以直接更改它们以添加您的默认值。一般来说,我建议不要这样做,因为大多数时候它会更慢,更危险。可能在某些情况下它是有意义的,所以为了完整起见,我已经包含了这个选项。

于 2013-10-25T17:05:56.470 回答