我想在Impala查询中的现有表中添加两列名称

时间:2020-04-30 10:11:57

标签: impala

我正在编写以下查询,以在指定位置添加列,但出现以下错误:

alter table quantum_raw_dev.rpt_backup_allocation
change upt_type upt_type STRING after tray_size;

4 个答案:

答案 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 COLUMNHive中不可用,仅在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 ,...);

[注意:列名和类型之间没有逗号]