如何用Spark SQL创建Spark V2表?及相关定义与转换疑问
Spark SQL V2表定义、创建及转换指南
一、什么是Spark V2表
Spark的表API分为V1和V2两个版本,V2表基于新的DataSource V2 API实现,支持更多高级DDL操作(比如DROP COLUMN、RENAME COLUMN等),同时在元数据管理、跨数据源兼容性上更灵活,能更好对接Hive Metastore以外的数据源。你之前创建的是V1表,因此不支持DROP COLUMN操作。
二、创建Spark V2表的方法
针对Parquet格式结合Hive Metastore的场景,有两种创建V2表的方式:
方式1:指定V2版本的Parquet数据源
直接在USING子句中使用parquet.v2:
CREATE TABLE db_test.table_test_v2 ( name STRING, status STRING, field1 BIGINT, field2 BIGINT, data_dt STRING) USING parquet.v2 PARTITIONED BY (data_dt) LOCATION 's3://somebucket/db_test.db/table_test_v2';
方式2:通过表属性强制启用V2表
在TBLPROPERTIES中添加属性指定使用V2数据源:
CREATE TABLE db_test.table_test_v2 ( name STRING, status STRING, field1 BIGINT, field2 BIGINT, data_dt STRING) USING parquet PARTITIONED BY (data_dt) LOCATION 's3://somebucket/db_test.db/table_test_v2' TBLPROPERTIES ('spark.sql.sources.useV2SourceList' = 'parquet');
三、将现有V1表转换为V2表
V1表无法直接通过ALTER语句转换为V2表,需通过以下步骤迁移:
- 创建目标结构的V2表(按需去掉要删除的
field1、field2):
CREATE TABLE db_test.table_test_v2 ( name STRING, status STRING, data_dt STRING) USING parquet.v2 PARTITIONED BY (data_dt) LOCATION 's3://somebucket/db_test.db/table_test_v2';
- 将原V1表的数据插入到新V2表:
INSERT INTO db_test.table_test_v2 SELECT name, status, data_dt FROM db_test.table_test;
- 验证数据无误后,替换原表:
DROP TABLE db_test.table_test; ALTER TABLE db_test.table_test_v2 RENAME TO db_test.table_test;
内容的提问来源于stack exchange,提问作者Dyno Fu
相关产品推荐
相关产品推荐

