带动态分区的 CTAS

CTAS with Dynamic Partition

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

我正尝试为此使用 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 语句感兴趣的原因是:使用这个语句,我真的不需要指出每一列的名称。 但是如果我创建一个基于 table 的 orc 然后手动填充它,我必须在创建 table 时指明所有列。这没关系;但是,如果我现有的 table 包含很多列,那不是一个好主意。

不支持

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

FAILED: SemanticException [Error 10068]:
CREATE-TABLE-AS-SELECT does not support partitioning in the target table

两步:

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,您可以根据配置单元查询的方便和支持添加位置。

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

解决方案一: 检查 table 的元数据是否更新。

方案二: 如果解决方案 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';

修复 table

 MSCK REPAIR TABLE another_table;

然后你可以删除 source_table 并将 another_table 重命名为 source_table_name

其他答案都是正确的:如果您有 table 正是您想要的,您可以执行 CREATE TABLE dest LIKE src;,但您目前无法执行真正的动态 CTAS 来创建分区table 来自变量字段。

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