当我需要将列更改为分区(convert normal column as partition column in hive)时,我想创建一个新表来复制除一个列之外的所有列。我目前在原始表中有> 50列。有没有干净的方法呢?
类似的东西:
CREATE student_copy LIKE student EXCEPT age and hair_color;
谢谢!
答案 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;
复制结果并根据您对新表的要求进行修改,并运行修改后的命令以获取新表。