Create Table As Select (CTAS)
hive中还可以通过一个 create-table-as-select (CTAS) 语句中的查询结果来创建和填充表。 CTAS 创建的表是原子的,这意味着在填充所有查询结果之前,其他用户看不到该表。 因此,其他用户要么看到包含完整查询结果的表,要么根本看不到该表。
CTAS 中有两个部分,SELECT 部分可以是 HiveQL 支持的任何 SELECT 语句。 CTAS 的 CREATE 部分从 SELECT 部分获取结果模式,并使用其他表属性(例如 SerDe 和存储格式)创建目标表。
CREATE TABLE new_key_value_store
ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"
STORED AS RCFile
AS
SELECT (key % 1024) new_key, concat(key, value) key_value_pair
FROM key_value_store
SORT BY new_key, key_value_pair;
上面的 CTAS 语句使用从 SELECT 语句的这些字段及字段类型的结果数据 (new_key DOUBLE, key_value_pair STRING) 创建目标表 new_key_value_store。 如果 SELECT 语句没有指定列别名,则列名将自动分配给 _col0、_col1 和 _col2 等。另外,新的目标表是使用特定的 SerDe 和独立于源表中的源表的存储格式创建的。
从 Hive 0.13.0 开始,SELECT 语句可以包含一个或多个公用表表达式 (CTE),如 SELECT 语法中所示。 有关示例,请参阅公用表表达式。
create table s2 as
with q1 as ( select key from src where key = '4')
select * from q1;
能够从一个表中选择数据到另一个表是 Hive 最强大的功能之一。 Hive 在执行查询时处理数据从源格式到目标格式的转换。
注意: CTAS语法默认是textfile,所以要注意了假如as select的是其他格式的比如parquet,则可能会导致一行变多行的情况(因为parquet格式的可能字段包含换行符等),所以必须要加上 create table xxx stored as parquet as select... 所以使用这种方式建表注意加上指定的存储格式。踩过坑。。。。。。。。
从 Hive 3.2.0 开始,CTAS 语句可以为目标表定义分区规范 (HIVE-20241)。
待下载查证如何使用
CREATE TABLE partition_ctas_1 PARTITIONED BY (key) AS
SELECT value, key FROM src where key > 200 and key < 300;
CTAS 有以下限制:
|