我试图在hive列中插入某些派生值,并想知道为什么它不起作用。我的代码如下。
Insert into month as select month(datestamp) as month from gc_1;
此处月列已存在,其中包含NULL值,gc_1是表名。 我不确定是否可以使用月,日期等功能从其他列添加hive列。
答案 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
是包含许多字段的宽表,则很快就会变得乏味且容易出错。