HIVE:如何创建一个包含另一个表中所有列的表,除了其中一个表?

时间:2015-08-27 22:31:34

标签: hadoop hive

当我需要将列更改为分区(convert normal column as partition column in hive)时,我想创建一个新表来复制除一个列之外的所有列。我目前在原始表中有> 50列。有没有干净的方法呢?

类似的东西:

CREATE student_copy LIKE student EXCEPT age and hair_color;

谢谢!

3 个答案:

答案 0 :(得分:1)

你可以使用正则表达式: CTAS using REGEX column spec.

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语句(如Abraham所述):

SHOW CREATE TABLE student;

修改它以在所需的列上创建分区。之后,您可以在插入新表时使用带正则表达式的select。 如果您的分区列已经是此选择的一部分,那么您需要确保它是last column you insert。如果不是,您可以在正则表达式中排除该列并将其包含在最后。此外,如果您希望根据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'要求使用反手提示'`'在查询的正则表达式部分。我在声明之后将此参数设置为原始值:' hive.support.quoted.identifiers = column'

答案 1 :(得分:0)

CREATE TABLE student_copy LIKE student;

它只是复制源表定义。

CREATE TABLE student_copy AS select name, age, class from student;
  • 目标不能是分区表。
  • 目标不能是外部表格。
  • 它复制结构和数据

答案 2 :(得分:0)

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

SHOW CREATE TABLE student;

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