Hive 具有动态分区的CTAS

Hive 具有动态分区的CTAS,hive,partition,orc,Hive,Partition,Orc,我想将包含文本格式的现有表更改为orc格式。我可以通过以下方式做到这一点: (1) 手动创建具有分区的orc格式的表,然后, (2) 使用INSERT OVERRIDE语句填充表 我正在尝试为此使用CTAS(CREATETABLE…AS Select…)语句。 是否有任何方法可以将动态分区包含在CTAS语句中? 所以,如果我的文本数据集有多个分区(例如:年和月),我可以直接在CTAS语句中指出这一点吗 格式可能如下所示: CREATE TABLE TEST_TABLE STORED AS ORC

我想将包含文本格式的现有表更改为orc格式。我可以通过以下方式做到这一点: (1) 手动创建具有分区的orc格式的表,然后, (2) 使用INSERT OVERRIDE语句填充表

我正在尝试为此使用CTAS(CREATETABLE…AS Select…)语句。 是否有任何方法可以将动态分区包含在CTAS语句中? 所以,如果我的文本数据集有多个分区(例如:年和月),我可以直接在CTAS语句中指出这一点吗

格式可能如下所示:

CREATE TABLE TEST_TABLE
STORED AS ORC
WITH PARTITION(year, month)
LOCATION '/<my_location>'
tblproperties ("orc.compress"="SNAPPY")
AS SELECT * FROM <existing_table>;
CREATE TABLE TEST\u TABLE
储存为兽人
带分区(年、月)
位置“/”
TBLProperty(“orc.compress”=“SNAPPY”)
从中选择*;
有什么想法吗

注意:我对CTAS语句感兴趣的原因是:使用这个语句,我实际上不需要指出每个列的名称。 但是,如果我创建一个基于orc的表,然后手动填充它,我必须在创建表时指示所有列。这没关系;但是,如果我现有的表包含很多列,这不是一个好主意。

不受支持

hive> create table t partitioned by (p int) as select 1 as i;
失败:SemanticException[错误10068]:
CREATE-TABLE-AS-SELECT不支持目标表中的分区

两个步骤:

CREATE TABLE target_table_name LIKE source_table_name;

INSERT OVERWRITE TABLE target_table_name PARTITION(partition_column_name)
SELECT * FROM source_table_name;
Rest存储为ORC,您可以根据方便性和配置单元查询支持添加位置

对于外部表,这些步骤不起作用。问题是,数据在HDFS上的指向目录中更新,但在选择表时,我们看不到表中反映的更改。为此,您可以执行以下步骤:

解决方案1: 检查表元数据是否已更新

解决方案2: 如果解决方案1不起作用,则:

CREATE TABLE target_table_name LIKE source_table_name;

INSERT OVERWRITE TABLE target_table_name PARTITION(partition_column_name) 
  SELECT * FROM source_table_name;

CREATE EXTERNAL TABLE another_table_name LIKE source_table_name 
  STORED AS file_format_of_source_table 
  LOCATION 'location_of_source_table';
收拾桌子

 MSCK REPAIR TABLE another_table;

然后您可以删除源表并将另一个表重命名为
source\u-table\u-name

其他答案都是正确的:您可以像src一样创建表dest如果您有一个表,它正是您想要的,但是您当前无法执行真正的动态CTA来从变量字段创建分区表

此功能已添加到即将推出的Spark 3.0中: