CTAS与动态分区(CTAS with Dynamic Partition)

2019-09-29 07:26发布

我想改变现有的表,包含文本格式,为兽人格式。 我能够做到这一点:(1)在兽人格式创建表手动具有分区,然后,(2)使用INSERT语句OVERWRITE来填充该表。

我试图用CTAS(创建表... AS选择...)这个说法。 有没有什么办法可以包括与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语句的原因是:使用此声明,我并不真的需要指出的每列名。 但是,如果我创建一个基于兽人表,然后手动填充它,我不得不表示所有列在创建表。 这是正常的; 但是,并不是一个好主意,如果我现有的表包含了很多列。

Answer 1:

不支持

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

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



Answer 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;

休息存储为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_tablesource_table_name



Answer 3:

其他答案都是正确的:你可以做的CREATE TABLE dest LIKE src; 如果你有一个表,这正是你想要的,但你不能做目前真正动态CTAS创建自变量字段的分区表。

这个功能已经被添加到即将到来的星火3.0: https://issues.apache.org/jira/browse/SPARK-26435



文章来源: CTAS with Dynamic Partition