通过select在Hive中插入值

时间:2015-01-20 17:41:21

标签: sql hadoop hive

我试图在hive列​​中插入某些派生值,并想知道为什么它不起作用。我的代码如下。

Insert into month as select month(datestamp) as month from gc_1;

此处列已存在,其中包含NULL值,gc_1是表名。 我不确定是否可以使用日期等功能从其他列添加hive列​​。

1 个答案:

答案 0 :(得分:2)

从您的问题来看,这是我认为您要实现的目标:有一个名为gc_1的表,其中已存在一个名为datestamp的列,可能包含一个适合作为参数的日期字符串month函数。然后,您希望在名为gc_1的{​​{1}}中创建一个新列(顺便说一下,我不建议这样做,因为month也是内置函数的名称)并使用month列中所有相应值的日历月填充它。

假设我已经正确地解释了你的意图,这是一个通用的方法:

datestamp

确认CREATE TABLE temp_table AS SELECT *, MONTH(datestamp) AS month FROM gc_1; 的内容符合您的预期后,请放弃temp_table并将gc_1重命名为temp_table

gc_1

这当然会暂时复制DROP TABLE gc_1; ALTER TABLE temp_table RENAME TO gc_1; ,因此有关确保您有足够存储空间的明智警告。

作为替代方案,有一种方法可以避免存储重复的表:

gc_1

这会直接覆盖原始表,因此不会创建第二个表。但是,此选项存在一些缺点:

  • 首先不创建ALTER TABLE gc_1 ADD COLUMNS (month INT); INSERT OVERWRITE TABLE gc_1 SELECT column1, column2, ..., MONTH(datestamp) FROM gc_1; 的副本,如果在覆盖过程中出现任何问题,则无法撤消。
  • 您必须在查询中枚举gc_1的每一列(并按正确的顺序)。如果gc_1是包含许多字段的宽表,则很快就会变得乏味且容易出错。