具有动态分区的 CTAS



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

我正在尝试使用 CTAS(创建表...作为选择...对此声明。有什么方法可以将动态分区包含在 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 的表,然后手动填充它,我必须在创建表时指示所有列。这没关系;但是,如果我的现有表包含很多列,这不是一个好主意。

不支持

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

失败:语义异常 [错误 10068]:
创建表为选择不支持目标表中的分区

两个步骤:

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,您可以根据方便添加的位置,并通过 hive 查询提供支持。

对于外部表,这些步骤不起作用。问题是,数据在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

其他答案都是正确的:如果您有一个完全符合您期望的表,则可以执行CREATE TABLE dest LIKE src;,但您目前无法执行真正的动态 CTAS 以从变量字段创建分区表。

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

最新更新