我正在编写以下查询,以在指定位置添加列,但出现以下错误:
alter table quantum_raw_dev.rpt_backup_allocation
change upt_type upt_type STRING after tray_size;
答案 0 :(得分:0)
我认为您不能像上述那样在Impala的列之间添加列。
您可以备份数据,删除并使用新结构重新创建,然后从备份中加载表。另外,如果您的系统中有HIVE,则可以尝试执行以下步骤-
首先添加列,然后使用以下命令来移动列。
ALTER TABLE tab ADD COLUMNS (id BIGINT);
这会将id列移到开头。
ALTER TABLE tab CHANGE COLUMN id id BIGINT first;
这会将现存的col移到id之后。
ALTER TABLE tab CHANGE COLUMN existing_col existing_col string AFTER id;
应用所有DDL后,请刷新/使元数据无效。
答案 1 :(得分:0)
您不能在两者之间添加列。最好的方法是将数据归档到另一个表中。删除impala旧表,然后根据所需位置创建带有新列的新表,然后重新插入数据。
答案 2 :(得分:0)
添加或删除列
您可以使用ADD COLUMNS
将一列或多列添加到列列表的末尾,
或者(仅使用Impala
),您可以使用DROP COLUMN
删除列。
通用语法是
ALTER TABLE tablename ADD COLUMNS (col1 TYPE1,col2 TYPE2,… );
ALTER TABLE tablename DROP COLUMN colname;
例如,您可以将奖金整数列添加到employees表中:
ALTER TABLE employees ADD COLUMNS (bonus INT);
或者您可以从员工表中删除office_id
列:
ALTER TABLE employees DROP COLUMN office_id;
注释
DROP COLUMN
在Hive
中不可用,仅在Impala
中可用。但是,请参见下面的 “替换所有列” 。
您一次只能drop
一列。
要drop
多列,请使用多条语句或使用replace
列的方法(请参见下文)。
您不能add
在列表中间而不是末尾的一列。
但是,您可以add
列,然后更改顺序(请参见上文),或使用方法将replace
列(请参见下文)。
与更改列顺序一样,它们不会更改数据文件。
如果在您drop
除最后一行以外的任何列之前,表定义与数据文件一致,
您将需要重新创建数据文件,而无需删除列的值。
如果您drop
的最后一列,数据将仍然存在,但在发出查询时将被忽略。
如果您add
列中没有数据,那么这些列将在每一行中NULL
。
替换所有列
您还可以使用新的列列表完全replace
使用所有列。
这对于删除多列很有帮助,
<h1>or if you need to add columns in the middle of the list<h1>
<h2>(like your use case)<h2>
常规语法为
ALTER TABLE tablename REPLACE COLUMNS (col1 TYPE1,col2 TYPE2,… );
这将完全删除现有的列列表,并将其替换为新列表。
仅存在您在ALTER TABLE
语句中指定的列,并且它们将按照您提供的顺序排列。
注意
同样,这不会更改数据文件,只会更改表的元数据, 因此您要么希望新列表匹配数据文件,要么需要重新创建数据文件以匹配新列表。
答案 3 :(得分:0)
您可以使用以下方法将一列或多列添加到列列表的末尾:
ALTER TABLE << em> table_name >添加列( col_name col_type ,...);
[注意:列名和类型之间没有逗号]