hive:如何创建一个表,其中包含除其中一列之外的其他所有列?

wb1gzix0  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(564)

当我需要将一列更改为分区(在配置单元中将普通列转换为分区列)时,我希望创建一个新表来复制除一列之外的所有列。我当前在原始表中有>50列。有没有干净的方法?
比如: CREATE student_copy LIKE student EXCEPT age and hair_color; 谢谢!

ikfrs5lh

ikfrs5lh1#

您可以使用regex:cta和regex列规范:

set hive.support.quoted.identifiers=none;
CREATE TABLE student_copy AS SELECT `(age|hair_color)?+.+` FROM student;
set hive.support.quoted.identifiers=column;

但是(正如kishore kumar suthar所提到的:这不会创建分区表,因为ctas(create table as select)不支持分区表。
获取分区表的唯一方法是获取表的完整create语句(如abraham所述):

SHOW CREATE TABLE student;

更改它以在所需列上创建分区。然后在插入新表时可以使用select with regex。如果分区列已经是这个select的一部分,那么需要确保它是插入的最后一列。如果不是,您可以在regex中排除该列并将其作为last包含。另外,如果您希望基于insert语句创建多个分区,则需要启用“动态分区”:

set hive.support.quoted.identifiers=none;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO TABLE student_copy PARTITION(partcol1) SELECT `(age|hair_color|partcol1)?+.+`, partcol1 FROM student;
set hive.support.quoted.identifiers=column;

“hive.support.quoted.identifiers=none”是在查询的regex部分中使用反勾号“`”所必需的。我在语句“hive.support.quoted.identifiers=column”后将此参数设置为其原始值

polkgigr

polkgigr2#

我使用下面的命令来获取现有表的create语句。

SHOW CREATE TABLE student;

复制结果并根据您对新表的要求修改它,然后运行modified命令以获取新表。

sdnqo3pr

sdnqo3pr3#

CREATE TABLE student_copy LIKE student;

它只是复制源表定义。

CREATE TABLE student_copy AS select name, age, class from student;

无法对目标表进行分区。
目标不能是外部表。
它复制结构和数据

相关问题