具有动态分区的CTAS

时间:2017-04-05 21:07:48

标签: hive partition orc

我想将包含文本格式的现有表格更改为orc格式。我能够做到: (1)手动创建具有分区的orc格式的表,然后, (2)使用INSERT OVERWRITE语句填充表。

我正在尝试使用CTAS(Create Table ... 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>;

请问好吗?

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

3 个答案:

答案 0 :(得分:4)

不支持

hive> create table t partitioned by (p int) as select 1 as i;
  

FAILED:SemanticException [错误10068]:
  CREATE-TABLE-AS-SELECT不支持目标表中的分区

答案 1 :(得分:2)

两个步骤:

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_table并将another_table重命名为source_table_name

答案 2 :(得分:0)

其他答案都是正确的:如果您拥有的表恰好是您想要的,则可以执行CREATE TABLE dest LIKE src;,但是您目前不能执行真正的动态CTAS来从变量字段创建分区表。 / p>

此功能已添加到即将发布的Spark 3.0中:https://issues.apache.org/jira/browse/SPARK-26435