简介
Spark SQL是Apache Spark用于处理结构化数据的模块。SQL语法部分详细描述了SQL语法以及适用的用例示例。本文介绍数据定义语句(DDL)
。
数据定义语句(DDL)
数据定义语句用于在数据库中创建或修改数据库对象的结构。Spark SQL支持以下数据定义语句:
ALTER DATABASE:修改数据库
描述
ALTER DATABASE
语句用于更改数据库的属性或位置。请注意,DATABASE
、SCHEMA
和 NAMESPACE
的用法是可以互换的,可以相互替代使用。如果系统中找不到该数据库,将会报错。
更改属性
ALTER DATABASE SET DBPROPERTIES
语句用于更改与数据库关联的属性。指定的属性值将覆盖任何具有相同属性名的现有值。此语句主要用于记录数据库的元数据信息,并可用于审计目的。
# 语法
ALTER { DATABASE | SCHEMA | NAMESPACE } database_name
SET { DBPROPERTIES | PROPERTIES } ( property_name = property_value [ , ... ] )
参数
-
数据库名称 -
指定要更改的数据库的名称。
更改位置
ALTER DATABASE SET LOCATION
语句用于更改为数据库添加新表的默认父目录。请注意,它不会将数据库当前目录的内容移动到新指定的位置,也不会更改在指定数据库下的任何表/分区相关联的位置(自Spark 3.0.0起可用,Hive元存储版本为3.0.0及更高版本)。
# 语法
ALTER { DATABASE | SCHEMA | NAMESPACE } database_name
SET LOCATION 'new_location'
参数
-
数据库名称 -
指定要更改的数据库的名称。
这会将数据库的默认表位置更改为new_location。
但是该语句不会移动数据库现有表位置,只影响新创建表的位置。旧版本Hive metastore不支持该功能。
案例
-- Creates a database named `inventory`.
-- 创建名为inventory的数据库
CREATE DATABASE inventory;
-- Alters the database to set properties `Edited-by` and `Edit-date`.
-- 修改数据库属性,设置Edited-by和Edit-date
ALTER DATABASE inventory SET DBPROPERTIES ('Edited-by' = 'John', 'Edit-date' = '01/01/2001');
-- Verify that properties are set.
-- 验证属性已设置
DESCRIBE DATABASE EXTENDED inventory;
+-------------------------+------------------------------------------+
|database_description_item| database_description_value|
+-------------------------+------------------------------------------+
| Database Name| inventory|
| Description| |
| Location| file:/temp/spark-warehouse/inventory.db|
| Properties|((Edit-date,01/01/2001), (Edited-by,John))|
+-------------------------+------------------------------------------+
-- Alters the database to set a new location.
-- 修改数据库位置
ALTER DATABASE inventory SET LOCATION 'file:/temp/spark-warehouse/new_inventory.db';
-- Verify that a new location is set.
-- 验证位置已修改
DESCRIBE DATABASE EXTENDED inventory;
+-------------------------+-------------------------------------------+
|database_description_item| database_description_value|
+-------------------------+-------------------------------------------+
| Database Name| inventory|
| Description| |
| Location|file:/temp/spark-warehouse/new_inventory.db|
| Properties| ((Edit-date,01/01/2001), (Edited-by,John))|
+-------------------------+-------------------------------------------+
ALTER TABLE:修改表
描述
ALTER TABLE
语句用于更改表的schema或属性。
重命名
ALTER TABLE RENAME TO
语句用于重命名数据库中的现有表。表重命名命令不能用于在数据库之间移动表,只能用于同一数据库内重命名表。
如果表被缓存,该命令会清除表的缓存数据。表在下次被访问时,缓存将被懒加载填充。另外:
-
表重命名命令会取消引用该表的所有依赖对象的缓存,如视图。必须显式重新缓存这些依赖对象。
-
分区重命名命令会清除所有表依赖的缓存,但保持它们的缓存状态。所以它们的缓存会在下次访问时懒加载填充。
# 语法
ALTER TABLE table_identifier RENAME TO table_identifier
ALTER TABLE table_identifier partition_spec RENAME TO partition_spec
参数
-
表标识符:指定一个表名称,可以选择使用数据库名称对其进行限定。 -
语法:[database_name.]table_name -
分区_规范:要重命名的分区。请注意,可以在分区规范中使用类型化的文字(例如,日期“2019-01-02”)。 -
语法:PARTITION(PARTITION_col_name=PARTITION_col_val[,…])
添加列
ALTER TABLE ADD COLUMNS
语句将提到的列添加到现有表中。
ALTER TABLE table_identifier ADD COLUMNS ( col_spec [ , ... ] )
参数
-
表标识符:指定表名称,可以选择使用数据库名称来限定该表名称。
-
语法:[ database_name. ] table_name -
列(col_spec):指定要添加的列。
删除列
ALTER TABLE DROP COLUMNS
语句从现有表中删除提到的列。请注意,此语句仅支持 v2 表
。
ALTER TABLE table_identifier DROP { COLUMN | COLUMNS } [ ( ] col_name [ , ... ] [ ) ]
参数
-
表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
语法:[ database_name. ] table_name
-
列名
指定列的名称。
重命名列
ALTER TABLE RENAME COLUMN
语句更改现有表的列名。请注意,此语句仅支持 v2 表。
ALTER TABLE table_identifier RENAME COLUMN col_name TO col_name
-
参数 表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
语法:[ database_name. ] table_name
-
列名
指定列的名称。
ALTER OR CHANGE COLUMN
ALTER TABLE ALTER COLUMN
或ALTER TABLE CHANGE COLUMN
语句更改列的定义。
ALTER TABLE table_identifier { ALTER | CHANGE } [ COLUMN ] col_name alterColumnAction
参数
-
表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
句法:[ database_name. ] table_name
-
列名
指定列的名称。
-
更改列操作
更改列的定义。
替换列
ALTER TABLE REPLACE COLUMNS
语句删除所有现有列并添加新的列集。请注意,只有v2表才支持此语句。
ALTER TABLE table_identifier [ partition_spec ] REPLACE COLUMNS
[ ( ] qualified_col_type_with_position_list [ ) ]
参数
-
表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
语法:[ database_name. ] table_name
-
分区规范
需要更换分区。请注意,可以在分区规范中使用类型文字(例如,日期“2019-01-02”)。
语法:PARTITION ( partition_col_name = partition_col_val [ , ... ] )
-
qualified_col_type_with_position_list
要添加的列的列表
语法:col_name col_type [ col_comment ] [ col_position ] [ , ... ]
添加和删除分区
添加分区
ALTER TABLE ADD
语句将分区添加到已分区的表中。
如果表已缓存,则该命令将清除该表的缓存数据及其引用该表的所有从属项。下次访问该表或从属项时,缓存将被延迟填充。
ALTER TABLE table_identifier ADD [IF NOT EXISTS]
( partition_spec [ partition_spec ... ] )
参数
-
表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
语法:[ database_name. ] table_name
-
分区规范
待添加分区。请注意,可以在分区规范中使用类型文字(例如,日期“2019-01-02”)。
语法:PARTITION ( partition_col_name = partition_col_val [ , ... ] )
删除分区
ALTER TABLE DROP
语句删除表的分区。
如果表已缓存,则该命令将清除该表的缓存数据及其引用该表的所有从属项。下次访问该表或从属项时,缓存将被延迟填充。
ALTER TABLE table_identifier DROP [ IF EXISTS ] partition_spec [PURGE]
参数
-
表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
语法:[ database_name. ] table_name
-
分区规范
要删除的分区。请注意,可以在分区规范中使用类型文字(例如,日期“2019-01-02”)。
语法:PARTITION ( partition_col_name = partition_col_val [ , ... ] )
设置和取消设置
设置表属性
ALTER TABLE SET
命令用于设置表属性。
如果已经设置了特定的属性,则会用新值覆盖旧值。
ALTER TABLE UNSET
用于删除表属性。
-- Set Table Properties
ALTER TABLE table_identifier SET TBLPROPERTIES ( key1 = val1, key2 = val2, ... )
-- Unset Table Properties
ALTER TABLE table_identifier UNSET TBLPROPERTIES [ IF EXISTS ] ( key1, key2, ... )
设置SERDE
ALTER TABLE SET
命令用于设置配置单元表中的SERDE或SERDE属性
。如果已经设置了特定的属性,则会用新值覆盖旧值。
-- Set SERDE Properties
ALTER TABLE table_identifier [ partition_spec ]
SET SERDEPROPERTIES ( key1 = val1, key2 = val2, ... )
ALTER TABLE table_identifier [ partition_spec ] SET SERDE serde_class_name
[ WITH SERDEPROPERTIES ( key1 = val1, key2 = val2, ... ) ]
设置位置和设置文件格式
ALTER TABLE SET
命令也可用于更改现有表的文件位置和文件格式。
如果表被缓存,则ALTER TABLE .. SET LOCATION
命令清除表的缓存数据及其引用该表的所有从属项。下次访问表或从属项时,缓存将被惰性填充。
-- Changing File Format
ALTER TABLE table_identifier [ partition_spec ] SET FILEFORMAT file_format
-- Changing File Location
ALTER TABLE table_identifier [ partition_spec ] SET LOCATION 'new_location'
参数
-
表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
语法:[ database_name. ] table_name
-
分区规范
指定必须在其上设置属性的分区。请注意,可以在分区规范中使用类型文字(例如,日期“2019-01-02”)。
语法:PARTITION ( partition_col_name = partition_col_val [ , ... ] )
SERDEPROPERTIES ( key1 = val1, key2 = val2, … )
-
指定要设置的 SERDE 属性。
恢复分区
ALTER TABLE RECOVER PARTITIONS
语句恢复表目录中的所有分区并更新配置单元元存储。恢复分区的另一种方法是使用MSCK REPAIR TABLE
。
ALTER TABLE table_identifier RECOVER PARTITIONS
参数
-
表标识符
指定表名称,可以选择使用数据库名称来限定该表名称。
语法:[ database_name. ] table_name
案例
-- RENAME table
DESC student;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE Student RENAME TO StudentInfo;
-- After Renaming the table
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- RENAME partition
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=10|
| age=11|
| age=12|
+---------+
ALTER TABLE default.StudentInfo PARTITION (age='10') RENAME TO PARTITION (age='15');
-- After renaming Partition
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
-- Add new columns to a table
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo ADD columns (LastName string, DOB timestamp);
-- After Adding New columns to the table
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| LastName| string| NULL|
| DOB|timestamp| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- Drop columns of a table
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| LastName| string| NULL|
| DOB|timestamp| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo DROP columns (LastName, DOB);
-- After dropping columns of the table
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- Rename a column of a table
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo RENAME COLUMN name TO FirstName;
-- After renaming a column of the table
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| FirstName| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- ALTER OR CHANGE COLUMNS
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| FirstName| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo ALTER COLUMN FirstName COMMENT "new comment";
-- After ALTER or CHANGE COLUMNS
DESC StudentInfo;
+-----------------------+---------+-----------+
| col_name|data_type| comment|
+-----------------------+---------+-----------+
| FirstName| string|new comment|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type| comment|
| age| int| NULL|
+-----------------------+---------+-----------+
-- REPLACE COLUMNS
DESC StudentInfo;
+-----------------------+---------+-----------+
| col_name|data_type| comment|
+-----------------------+---------+-----------+
| FirstName| string|new comment|
| rollno| int| NULL|
| age| int| NULL|
|# Partition Information| | |
| # col_name|data_type| comment|
| age| int| NULL|
+-----------------------+---------+-----------+
ALTER TABLE StudentInfo REPLACE COLUMNS (name string, ID int COMMENT 'new comment');
-- After replacing COLUMNS
DESC StudentInfo;
+-----=---------+---------+-----------+
| col_name|data_type| comment|
+---------------+---------+-----------+
| name| string| NULL|
| ID| int|new comment|
| # Partitioning| | |
|Not partitioned| | |
+---------------+---------+-----------+
-- Add a new partition to a table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18);
-- After adding a new partition to the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
| age=18|
+---------+
-- Drop a partition from the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
| age=18|
+---------+
ALTER TABLE StudentInfo DROP IF EXISTS PARTITION (age=18);
-- After dropping the partition of the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
-- Adding multiple partitions to the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18) PARTITION (age=20);
-- After adding multiple partitions to the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
| age=18|
| age=20|
+---------+
-- Change the fileformat
ALTER TABLE loc_orc SET fileformat orc;
ALTER TABLE p1 partition (month=2, day=2) SET fileformat parquet;
-- Change the file Location
ALTER TABLE dbx.tab1 PARTITION (a='1', b='2') SET LOCATION '/path/to/part/ways'
-- SET SERDE/ SERDE Properties
ALTER TABLE test_tab SET SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe';
ALTER TABLE dbx.tab1 SET SERDE 'org.apache.hadoop' WITH SERDEPROPERTIES ('k' = 'v', 'kay' = 'vee')
-- SET TABLE PROPERTIES
ALTER TABLE dbx.tab1 SET TBLPROPERTIES ('winner' = 'loser');
-- SET TABLE COMMENT Using SET PROPERTIES
ALTER TABLE dbx.tab1 SET TBLPROPERTIES ('comment' = 'A table comment.');
-- Alter TABLE COMMENT Using SET PROPERTIES
ALTER TABLE dbx.tab1 SET TBLPROPERTIES ('comment' = 'This is a new comment.');
-- DROP TABLE PROPERTIES
ALTER TABLE dbx.tab1 UNSET TBLPROPERTIES ('winner');
-- RECOVER PARTITIONS
ALTER TABLE dbx.tab1 RECOVER PARTITIONS;
ALTER TABLE
是一个强大的语句,可用来修改表的结构或元数据信息。要注意的是,ALTER TABLE
只能修改表的schema或属性信息,不能直接修改表的数据。
ALTER VIEW:修改视图
描述
ALTER VIEW
语句可以修改与视图相关的元数据。它可以更改视图的定义,更改视图的名称为不同的名称,通过设置 TBLPROPERTIES
来设置和取消设置视图的元数据。
重命名视图
重命名现有的视图。如果新视图名称已经存在于源数据库中,将抛出一个 TableAlreadyExistsException
。这个操作不支持在数据库之间移动视图。
如果视图被缓存,该命令会清除视图及所有依赖它的视图的缓存数据。视图的缓存将在下次访问视图时懒加载。该命令将视图的依赖项保留为未缓存状态。
语法
-- ALTER VIEW 视图标识符 RENAME TO 视图标识符
ALTER VIEW view_identifier RENAME TO view_identifier
参数
-
视图标识符
指定一个视图名称,可以选择使用数据库名称进行限定。
语法:
[database_name.] view_name
翻译:
设置视图属性
设置一个或多个现有视图的属性。属性是键值对。如果属性键已经存在,则用新值替换旧值。如果属性键不存在,则将键值对添加到属性中。
语法
ALTER VIEW view_identifier SET TBLPROPERTIES ( property_key = property_val [ , ... ] )
参数
-
视图标识符
指定一个视图名称,可以选择使用数据库名称进行限定。
语法:
[database_name.] view_name
-
属性键
指定属性键。键可以由多个用点分隔的部分组成。
语法:
[key_part1] [.key_part2] [ ... ]
取消设置视图属性
删除一个或多个现有视图的属性。如果指定的键不存在,将抛出异常。使用 IF EXISTS
避免抛出异常。
语法
ALTER VIEW view_identifier UNSET TBLPROPERTIES [ IF EXISTS ] ( property_key [ , ... ] )
参数
-
视图标识符
指定一个视图名称,可以选择使用数据库名称进行限定。
语法:
[database_name.] view_name
-
属性键
指定属性键。键可以由多个用点分隔的部分组成。
语法:
[key_part1] [.key_part2] [ ... ]
ALTER View AS SELECT
ALTER VIEW 视图标识符 AS SELECT
语句更改视图的定义。SELECT
语句必须有效,并且 视图标识符
必须存在。
语法
ALTER VIEW view_identifier AS select_statement
❝
注意:
ALTER VIEW
语句不支持SET SERDE
或SET SERDEPROPERTIES
属性。
参数
-
视图标识符
指定一个要更改的视图名称,可以选择使用数据库名称进行限定。
语法:
[database_name.] view_name
-
select_statement
指定视图的定义。查看select_statement获取详细信息。。
这将重写视图的定义,而不需要先删除后重新创建。
案例
-- 仅更改视图名称。
-- 视图的源数据库和目标数据库必须相同。
-- 使用限定名或非限定名指定源视图和目标视图。
ALTER VIEW tempdb1.v1 RENAME TO tempdb1.v2;
-- 验证新视图是否已创建。
DESCRIBE TABLE EXTENDED tempdb1.v2;
+----------------------------+----------+-------+
| col_name|data_type |comment|
+----------------------------+----------+-------+
| c1| int| null|
| c2| string| null|
| | | |
|# Detailed Table Information| | |
| Database| tempdb1| |
| Table| v2| |
+----------------------------+----------+-------+
-- 在ALTER VIEW SET TBLPROPERTIES之前
DESC TABLE EXTENDED tempdb1.v2;
+----------------------------+----------+-------+
| col_name| data_type|comment|
+----------------------------+----------+-------+
| c1| int| null|
| c2| string| null|
| | | |
|# Detailed Table Information| | |
| Database| tempdb1| |
| Table| v2| |
| Table Properties| [....]| |
+----------------------------+----------+-------+
-- 在TBLPROPERTIES中设置属性
ALTER VIEW tempdb1.v2 SET TBLPROPERTIES ('created.by.user' = "John", 'created.date' = '01-01-2001' );
-- -- 使用 DESCRIBE TABLE EXTENDED tempdb1.v2 进行验证
DESC TABLE EXTENDED tempdb1.v2;
+----------------------------+-----------------------------------------------------+-------+
| col_name| data_type|comment|
+----------------------------+-----------------------------------------------------+-------+
| c1| int| null|
| c2| string| null|
| | | |
|# Detailed Table Information| | |
| Database| tempdb1| |
| Table| v2| |
| Table Properties|[created.by.user=John, created.date=01-01-2001, ....]| |
+----------------------------+-----------------------------------------------------+-------+
-- 从TBLPROPERTIES中删除created.by.user 和 created.date键
ALTER VIEW tempdb1.v2 UNSET TBLPROPERTIES ('created.by.user', 'created.date');
---- 使用 DESC TABLE EXTENDED tempdb1.v2 验证更改
DESC TABLE EXTENDED tempdb1.v2;
+----------------------------+----------+-------+
| col_name| data_type|comment|
+----------------------------+----------+-------+
| c1| int| null|
| c2| string| null|
| | | |
|# Detailed Table Information| | |
| Database| tempdb1| |
| Table| v2| |
| Table Properties| [....]| |
+----------------------------+----------+-------+
-- 更改视图定义
ALTER VIEW tempdb1.v2 AS SELECT * FROM tempdb1.v1;
-- -- 使用 DESC TABLE EXTENDED 进行验证
DESC TABLE EXTENDED tempdb1.v2;
+----------------------------+---------------------------+-------+
| col_name| data_type|comment|
+----------------------------+---------------------------+-------+
| c1| int| null|
| c2| string| null|
| | | |
|# Detailed Table Information| | |
| Database| tempdb1| |
| Table| v2| |
| Type| VIEW| |
| View Text| select * from tempdb1.v1| |
| View Original Text| select * from tempdb1.v1| |
+----------------------------+---------------------------+-------+
CREATE DATABASE:创建数据库
描述
使用指定名称创建数据库。如果同名数据库已经存在,将抛出异常。
语法
CREATE { DATABASE | SCHEMA } [ IF NOT EXISTS ] database_name
[ COMMENT database_comment ]
[ LOCATION database_directory ]
[ WITH DBPROPERTIES ( property_name = property_value [ , ... ] ) ]
参数
-
database_name
:要创建的数据库的名称。 -
IF NOT EXISTS
:如果数据库已经存在,则不执行创建操作。 -
database_directory
:指定在文件系统中的路径来创建数据库。如果指定路径不存在,将会创建路径。如果未指定,则在默认仓库目录中创建,路径由spark.sql.warehouse.dir配置。 -
database_comment
:数据库的注释。 -
WITH DBPROPERTIES (property_name=property_value [, ...] )
:以键值对的形式指定数据库属性。
关键参数:
-
database_name
:数据库名称 -
IF NOT EXISTS
:避免重复创建 -
LOCATION
:指定HDFS路径 -
COMMENT
:数据库注释 -
DBPROPERTIES
:数据库属性
案例
-- -- 创建数据库customer_db,如果已存在则会抛出异常
-- already exists.
CREATE DATABASE customer_db;
-- 如果customer_db不存在则创建,避免异常t.
CREATE DATABASE IF NOT EXISTS customer_db;
-- 如果不存在则创建,同时指定注释、位置和属性
CREATE DATABASE IF NOT EXISTS customer_db COMMENT 'This is customer database' LOCATION '/user'
WITH DBPROPERTIES (ID=001, Name='John');
-- 验证属性是否设置成功
DESCRIBE DATABASE EXTENDED customer_db;
+-------------------------+--------------------------+
|database_description_item|database_description_value|
+-------------------------+--------------------------+
| Database Name| customer_db|
| Description| This is customer database|
| Location| hdfs://hacluster/user|
| Properties| ((ID,001), (Name,John))|
+-------------------------+--------------------------+
CREATE FUNCTION:创建函数
描述
CREATE FUNCTION
语句用于在Spark中创建临时函数或永久函数。临时函数作用域为会话级别,永久函数创建在持久化目录中,对所有会话可用。在首次执行时,USING
子句中指定的资源对所有执行器可用。除了SQL接口外,spark还允许使用Scala、Python和Java API创建自定义标量和聚合函数。
语法
CREATE [ OR REPLACE ] [ TEMPORARY ] FUNCTION [ IF NOT EXISTS ]
function_name AS class_name [ resource_locations ]
参数
-
OR REPLACE
如果指定,则重载函数的资源。这在捕捉到函数实现中的任何更改时主要有用。该参数与
IF NOT EXISTS
互斥,不能同时指定。 -
TEMPORARY
指示所创建函数的作用域。当指定
TEMPORARY
时,创建的函数在当前会话中有效且可见。这种函数不会在目录中留下持久条目。 -
IF NOT EXISTS
如果指定,则只在函数不存在时创建它。如果指定的函数已经存在于系统中,函数的创建将成功(不会抛出错误)。该参数与
OR REPLACE
互斥,不能同时指定。 -
function_name
指定要创建的函数的名称。函数名可以选择性地与数据库名修饰。
语法:
[ database_name. ] function_name
-
class_name
指定为要创建的函数提供实现的类的名称。实现类应扩展如下基类之一:
-
应扩展
org.apache.hadoop.hive.ql.exec
包中的UDF
或UDAF
。 -
应扩展
org.apache.hadoop.hive.ql.udf.generic
包中的AbstractGenericUDAFResolver
、GenericUDF
或GenericUDTF
。 -
应扩展
org.apache.spark.sql.expressions
包中的UserDefinedAggregateFunction
。 -
resource_locations
指定包含函数实现及其依赖项的资源列表。
语法:
USING { { (JAR | FILE | ARCHIVE) resource_uri } , ... }
案例
-- 1. Create a simple UDF `SimpleUdf` that increments the supplied integral value by 10.
-- import org.apache.hadoop.hive.ql.exec.UDF;
-- public class SimpleUdf extends UDF {
-- public int evaluate(int value) {
-- return value + 10;
-- }
-- }
-- 2. Compile and place it in a JAR file called `SimpleUdf.jar` in /tmp.
-- Create a table called `test` and insert two rows.
CREATE TABLE test(c1 INT);
INSERT INTO test VALUES (1), (2);
-- Create a permanent function called `simple_udf`.
CREATE FUNCTION simple_udf AS 'SimpleUdf'
USING JAR '/tmp/SimpleUdf.jar';
-- Verify that the function is in the registry.
SHOW USER FUNCTIONS;
+------------------+
| function|
+------------------+
|default.simple_udf|
+------------------+
-- Invoke the function. Every selected value should be incremented by 10.
SELECT simple_udf(c1) AS function_return_value FROM test;
+---------------------+
|function_return_value|
+---------------------+
| 11|
| 12|
+---------------------+
-- Created a temporary function.
CREATE TEMPORARY FUNCTION simple_temp_udf AS 'SimpleUdf'
USING JAR '/tmp/SimpleUdf.jar';
-- Verify that the newly created temporary function is in the registry.
-- Please note that the temporary function does not have a qualified
-- database associated with it.
SHOW USER FUNCTIONS;
+------------------+
| function|
+------------------+
|default.simple_udf|
| simple_temp_udf|
+------------------+
-- 1. Modify `SimpleUdf`'s implementation to add supplied integral value by 20.
-- import org.apache.hadoop.hive.ql.exec.UDF;
-- public class SimpleUdfR extends UDF {
-- public int evaluate(int value) {
-- return value + 20;
-- }
-- }
-- 2. Compile and place it in a jar file called `SimpleUdfR.jar` in /tmp.
-- Replace the implementation of `simple_udf`
CREATE OR REPLACE FUNCTION simple_udf AS 'SimpleUdfR'
USING JAR '/tmp/SimpleUdfR.jar';
-- Invoke the function. Every selected value should be incremented by 20.
SELECT simple_udf(c1) AS function_return_value FROM test;
+---------------------+
|function_return_value|
+---------------------+
| 21|
| 22|
+---------------------+
CREATE TABLE:创建表
描述
CREATE TABLE
语句用于在现有数据库中定义表。
CREATE 语句有:
1、CREATE TABLE USING DATA_SOURCE
描述
CREATE TABLE
语句使用数据源定义一个新表。
语法
CREATE TABLE [ IF NOT EXISTS ] table_identifier
[ ( col_name1 col_type1 [ COMMENT col_comment1 ], ... ) ]
USING data_source
[ OPTIONS ( key1=val1, key2=val2, ... ) ]
[ PARTITIONED BY ( col_name1, col_name2, ... ) ]
[ CLUSTERED BY ( col_name3, col_name4, ... )
[ SORTED BY ( col_name [ ASC | DESC ], ... ) ]
INTO num_buckets BUCKETS ]
[ LOCATION path ]
[ COMMENT table_comment ]
[ TBLPROPERTIES ( key1=val1, key2=val2, ... ) ]
[ AS select_statement ]
❝
注意,USING子句和AS SELECT子句之间的子句可以任意顺序出现。例如,你可以在TBLPROPERTIES之后写COMMENT table_comment。
参数
-
table_identifier
指定表名,可以选择性地与数据库名修饰。
语法:
[ database_name. ] table_name
-
USING data_source
数据源是用于创建表的输入格式。数据源可以是CSV, TXT, ORC, JDBC, PARQUET等。
-
OPTIONS
将注入到存储属性的数据源选项。
-
PARTITIONED BY
根据指定的列在表上创建分区。
-
CLUSTERED BY
根据用于桶划分的指定列,在表上创建的分区将被划分成固定的桶。
注意: 桶划分是一种优化技术,使用桶(和桶划分列)来确定数据分区,避免数据混洗。
-
SORTED BY
指定桶列的排序方式。可以在SORTED BY子句中的任意列名后使用ASC表示升序,或DESC表示降序。如果未指定,默认为ASC。
-
INTO num_buckets BUCKETS
指定桶的数量,在
CLUSTERED BY
子句中使用。 -
LOCATION
存储表数据的目录路径,可以是HDFS等分布式存储上的路径。
-
COMMENT
描述表的字符串字面值。
-
TBLPROPERTIES
一组用于标记表定义的键-值对。
-
AS select_statement
使用SELECT语句的数据填充表。
Data Source Interaction:数据源交互
数据源表的作用类似于指向底层数据源的指针。例如,你可以使用JDBC数据源在Spark中创建一个表“foo”,它指向MySQL中的一个表“bar”。当你读取/写入表“foo”时,实际上是在读取/写入表“bar”。
通常,CREATE TABLE
是在创建一个“指针”,你需要确保它指向的是已经存在的东西。parquet、json等文件源是一个例外。如果你没有指定LOCATION,Spark会为你创建一个默认的表位置。
对于CREATE TABLE AS SELECT
,Spark会用输入查询的数据覆盖底层数据源,以确保创建的表包含的确切数据与输入查询相同。
所以,数据源表充当底层数据源的接口,允许Spark SQL连接外部系统。需要注意的是,CREATE TABLE
本身仅创建元数据,可能需要额外步骤来创建底层数据源。另外,CREATE TABLE AS SELECT
可以自动填充表数据。
案例
--Use data source
CREATE TABLE student (id INT, name STRING, age INT) USING CSV;
--Use data from another table
CREATE TABLE student_copy USING CSV
AS SELECT * FROM student;
--Omit the USING clause, which uses the default data source (parquet by default)
CREATE TABLE student (id INT, name STRING, age INT);
--Use parquet data source with parquet storage options
--The columns 'id' and 'name' enable the bloom filter during writing parquet file,
--column 'age' does not enable
CREATE TABLE student_parquet(id INT, name STRING, age INT) USING PARQUET
OPTIONS (
'parquet.bloom.filter.enabled'='true',
'parquet.bloom.filter.enabled#age'='false'
);
--Specify table comment and properties
CREATE TABLE student (id INT, name STRING, age INT) USING CSV
COMMENT 'this is a comment'
TBLPROPERTIES ('foo'='bar');
--Specify table comment and properties with different clauses order
CREATE TABLE student (id INT, name STRING, age INT) USING CSV
TBLPROPERTIES ('foo'='bar')
COMMENT 'this is a comment';
--Create partitioned and bucketed table
CREATE TABLE student (id INT, name STRING, age INT)
USING CSV
PARTITIONED BY (age)
CLUSTERED BY (Id) INTO 4 buckets;
--Create partitioned and bucketed table through CTAS
CREATE TABLE student_partition_bucket
USING parquet
PARTITIONED BY (age)
CLUSTERED BY (id) INTO 4 buckets
AS SELECT * FROM student;
--Create bucketed table through CTAS and CTE
CREATE TABLE student_bucket
USING parquet
CLUSTERED BY (id) INTO 4 buckets (
WITH tmpTable AS (
SELECT * FROM student WHERE id > 100
)
SELECT * FROM tmpTable
);
2、CREATE TABLE USING HIVE FORMAT
描述
CREATE TABLE
语句使用Hive格式定义一个新表。
语法
CREATE [ EXTERNAL ] TABLE [ IF NOT EXISTS ] table_identifier
[ ( col_name1[:] col_type1 [ COMMENT col_comment1 ], ... ) ]
[ COMMENT table_comment ]
[ PARTITIONED BY ( col_name2[:] col_type2 [ COMMENT col_comment2 ], ... )
| ( col_name1, col_name2, ... ) ]
[ CLUSTERED BY ( col_name1, col_name2, ...)
[ SORTED BY ( col_name1 [ ASC | DESC ], col_name2 [ ASC | DESC ], ... ) ]
INTO num_buckets BUCKETS ]
[ ROW FORMAT row_format ]
[ STORED AS file_format ]
[ LOCATION path ]
[ TBLPROPERTIES ( key1=val1, key2=val2, ... ) ]
[ AS select_statement ]
❝
注意,列定义子句和AS SELECT子句之间的子句可以任意顺序出现。例如,你可以在TBLPROPERTIES之后写COMMENT table_comment。
参数
-
table_identifier
指定表名,可以选择性地与数据库名修饰。
语法:
[ database_name. ] table_name
-
EXTERNAL
使用提供的
LOCATION
路径定义表,不使用此表的默认位置。 -
PARTITIONED BY
根据指定的列在表上创建分区。
-
CLUSTERED BY
根据用于桶划分的指定列,在表上创建的分区将被划分成固定的桶。
注意: 桶划分是一种优化技术,使用桶(和桶划分列)来确定数据分区,避免数据混洗。
-
SORTED BY
指定桶列的排序方式。可以在SORTED BY子句中的任意列名后使用ASC表示升序,或DESC表示降序。如果未指定,默认为ASC。
-
INTO num_buckets BUCKETS
指定桶的数量,在
CLUSTERED BY
子句中使用。 -
row_format
指定输入和输出的行格式。详细语法见HIVE FORMAT。
-
STORED AS
表存储的文件格式,可以是TEXTFILE、ORC、PARQUET等。
-
LOCATION
存储表数据的目录路径,可以是HDFS等分布式存储上的路径。
-
COMMENT
描述表的字符串字面值。
-
TBLPROPERTIES
一组用于标记表定义的键-值对。
-
AS select_statement
使用SELECT语句的数据填充表。
案例
--Use hive format
CREATE TABLE student (id INT, name STRING, age INT) STORED AS ORC;
--Use data from another table
CREATE TABLE student_copy STORED AS ORC
AS SELECT * FROM student;
--Specify table comment and properties
CREATE TABLE student (id INT, name STRING, age INT)
COMMENT 'this is a comment'
STORED AS ORC
TBLPROPERTIES ('foo'='bar');
--Specify table comment and properties with different clauses order
CREATE TABLE student (id INT, name STRING, age INT)
STORED AS ORC
TBLPROPERTIES ('foo'='bar')
COMMENT 'this is a comment';
--Create partitioned table
CREATE TABLE student (id INT, name STRING)
PARTITIONED BY (age INT)
STORED AS ORC;
--Create partitioned table with different clauses order
CREATE TABLE student (id INT, name STRING)
STORED AS ORC
PARTITIONED BY (age INT);
--Use Row Format and file format
CREATE TABLE student (id INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
--Use complex datatype
CREATE EXTERNAL TABLE family(
name STRING,
friends ARRAY<STRING>,
children MAP<STRING, INT>,
address STRUCT<street: STRING, city: STRING>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\'
COLLECTION ITEMS TERMINATED BY '_'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY 'n'
NULL DEFINED AS 'foonull'
STORED AS TEXTFILE
LOCATION '/tmp/family/';
--Use predefined custom SerDe
CREATE TABLE avroExample
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES ('avro.schema.literal'='{ "namespace": "org.apache.hive",
"name": "first_schema",
"type": "record",
"fields": [
{ "name":"string1", "type":"string" },
{ "name":"string2", "type":"string" }
] }');
--Use personalized custom SerDe(we may need to `ADD JAR xxx.jar` first to ensure we can find the serde_class,
--or you may run into `CLASSNOTFOUND` exception)
ADD JAR /tmp/hive_serde_example.jar;
CREATE EXTERNAL TABLE family (id INT, name STRING)
ROW FORMAT SERDE 'com.ly.spark.serde.SerDeExample'
STORED AS INPUTFORMAT 'com.ly.spark.example.serde.io.SerDeExampleInputFormat'
OUTPUTFORMAT 'com.ly.spark.example.serde.io.SerDeExampleOutputFormat'
LOCATION '/tmp/family/';
--Use `CLUSTERED BY` clause to create bucket table without `SORTED BY`
CREATE TABLE clustered_by_test1 (ID INT, AGE STRING)
CLUSTERED BY (ID)
INTO 4 BUCKETS
STORED AS ORC
--Use `CLUSTERED BY` clause to create bucket table with `SORTED BY`
CREATE TABLE clustered_by_test2 (ID INT, NAME STRING)
PARTITIONED BY (YEAR STRING)
CLUSTERED BY (ID, NAME)
SORTED BY (ID ASC)
INTO 3 BUCKETS
STORED AS PARQUET
3、CREATE TABLE LIKE
描述
CREATE TABLE
语句使用现有表或视图的定义/元数据定义一个新表。
语法
CREATE TABLE [IF NOT EXISTS] table_identifier LIKE source_table_identifier
USING data_source
[ ROW FORMAT row_format ]
[ STORED AS file_format ]
[ TBLPROPERTIES ( key1=val1, key2=val2, ... ) ]
[ LOCATION path ]
参数
-
table_identifier
指定表名,可以选择性地与数据库名修饰。
语法:
[ database_name. ] table_name
-
USING data_source
数据源是用于创建表的输入格式。数据源可以是CSV, TXT, ORC, JDBC, PARQUET等。
-
ROW FORMAT
使用SERDE指定自定义SerDe或使用DELIMITED子句指定内置SerDe。
-
STORED AS
表存储的文件格式,可以是TEXTFILE、ORC、PARQUET等。
-
TBLPROPERTIES
指定需要设置的表属性,如
created.by.user
、owner
等。 -
LOCATION
存储表数据的目录路径,可以是HDFS等分布式存储上的路径。用于创建外部表的位置。
案例
-- Create table using an existing table
CREATE TABLE Student_Dupli like Student;
-- Create table like using a data source
CREATE TABLE Student_Dupli like Student USING CSV;
-- Table is created as external table at the location specified
CREATE TABLE Student_Dupli like Student location '/root1/home';
-- Create table like using a rowformat
CREATE TABLE Student_Dupli like Student
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
TBLPROPERTIES ('owner'='xxxx');
CREATE VIEW:创建视图
描述
视图基于 SQL
查询的结果集。CREATE VIEW
构造一个没有物理数据的虚拟表,因此像 ALTER VIEW
和 DROP VIEW
这样的其他操作只改变元数据。
语法
CREATE [ OR REPLACE ] [ [ GLOBAL ] TEMPORARY ] VIEW [ IF NOT EXISTS ] view_identifier
create_view_clauses AS query
参数
-
OR REPLACE
如果已经存在同名视图,则替换它。
-
[ GLOBAL ] TEMPORARY
TEMPORARY视图是会话作用域的,在会话结束时会被删除,因为它跳过在底层元数据存储(如果有的话)中持久化定义。GLOBAL TEMPORARY视图绑定到系统保留的临时数据库
global_temp
。 -
IF NOT EXISTS
如果视图不存在则创建它。
-
view_identifier
指定视图名,可以选择性地与数据库名修饰。
语法:
[ database_name. ] view_name
-
create_view_clauses
这些子句是可选的,顺序不敏感。可以是以下格式:
-
[ ( column_name [ COMMENT column_comment ], ... ) ]
指定列级注释。 -
[ COMMENT view_comment ]
指定视图级注释。 -
[ TBLPROPERTIES ( property_name = property_value [ , ... ] ) ]
添加键值对元数据。 -
query
从基表或其他视图构造视图的 SELECT 语句。
案例
-- Create or replace view for `experienced_employee` with comments.
CREATE OR REPLACE VIEW experienced_employee
(ID COMMENT 'Unique identification number', Name)
COMMENT 'View for experienced employees'
AS SELECT id, name FROM all_employee
WHERE working_years > 5;
-- Create a global temporary view `subscribed_movies` if it does not exist.
CREATE GLOBAL TEMPORARY VIEW IF NOT EXISTS subscribed_movies
AS SELECT mo.member_id, mb.full_name, mo.movie_title
FROM movies AS mo INNER JOIN members AS mb
ON mo.member_id = mb.id;
DROP DATABASE:删除数据库
描述
删除数据库并从文件系统中删除与该数据库相关联的目录。如果系统中不存在该数据库,将抛出异常。
语法
DROP { DATABASE | SCHEMA } [ IF EXISTS ] dbname [ RESTRICT | CASCADE ]
参数
-
DATABASE | SCHEMA
DATABASE
和SCHEMA
是同义词,二者可以互换使用。 -
IF EXISTS
如果指定,当数据库不存在时不会抛出异常。
-
RESTRICT
如果指定,将限制删除非空数据库,默认启用。
-
CASCADE
如果指定,将删除所有关联的表和函数。
案例
-- Create `inventory_db` Database
CREATE DATABASE inventory_db COMMENT 'This database is used to maintain Inventory';
-- Drop the database and it's tables
DROP DATABASE inventory_db CASCADE;
-- Drop the database using IF EXISTS
DROP DATABASE IF EXISTS inventory_db CASCADE;
DROP FUNCTION:删除函数
描述
DROP FUNCTION
语句用于删除临时函数或用户定义函数(UDF)。如果函数不存在会抛出异常。
语法
DROP [ TEMPORARY ] FUNCTION [ IF EXISTS ] function_name
参数
-
function_name
指定已存在函数的名称。函数名可以选择性地与数据库名修饰。
语法:
[ database_name. ] function_name
-
TEMPORARY
用于删除
TEMPORARY
函数。 -
IF EXISTS
如果指定,当函数不存在时不会抛出异常。
案例
-- Create a permanent function `test_avg`
CREATE FUNCTION test_avg AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFAverage';
-- List user functions
SHOW USER FUNCTIONS;
+----------------+
| function|
+----------------+
|default.test_avg|
+----------------+
-- Create Temporary function `test_avg`
CREATE TEMPORARY FUNCTION test_avg AS
'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFAverage';
-- List user functions
SHOW USER FUNCTIONS;
+----------------+
| function|
+----------------+
|default.test_avg|
| test_avg|
+----------------+
-- Drop Permanent function
DROP FUNCTION test_avg;
-- Try to drop Permanent function which is not present
DROP FUNCTION test_avg;
Error: Error running query:
org.apache.spark.sql.catalyst.analysis.NoSuchPermanentFunctionException:
Function 'default.test_avg' not found in database 'default'; (state=,code=0)
-- List the functions after dropping, it should list only temporary function
SHOW USER FUNCTIONS;
+--------+
|function|
+--------+
|test_avg|
+--------+
-- Drop Temporary function
DROP TEMPORARY FUNCTION IF EXISTS test_avg;
DROP TABLE:删除表
描述
DROP TABLE
删除表,如果表不是EXTERNAL
表,还会从文件系统中移除与表关联的目录。如果表不存在会抛出异常。
对于外部表,只会从metastore数据库中移除相关的元数据信息。
如果表被缓存,该命令会取消缓存表及所有依赖表的缓存。
语法
DROP TABLE [ IF EXISTS ] table_identifier [ PURGE ]
参数
-
IF EXISTS
如果指定,当表不存在时不会抛出异常。
-
table_identifier
指定要删除的表名。表名可以选择性地与数据库名修饰。
语法:
[ database_name. ] table_name
-
PURGE
如果指定,删除表时完全清除表而不放入回收站(注意:PURGE在Hive Metastore 0.14.0及更高版本可用)。
案例
-- Assumes a table named `employeetable` exists.
DROP TABLE employeetable;
-- Assumes a table named `employeetable` exists in the `userdb` database
DROP TABLE userdb.employeetable;
-- Assumes a table named `employeetable` does not exist.
-- Throws exception
DROP TABLE employeetable;
Error: org.apache.spark.sql.AnalysisException: Table or view not found: employeetable;
(state=,code=0)
-- Assumes a table named `employeetable` does not exist,Try with IF EXISTS
-- this time it will not throw exception
DROP TABLE IF EXISTS employeetable;
-- Completely purge the table skipping trash.
DROP TABLE employeetable PURGE;
DROP VIEW:删除视图
描述
DROP VIEW
从 catalog 中移除与指定视图相关的元数据。
案例
DROP VIEW [ IF EXISTS ] view_identifier
参数
-
IF EXISTS
如果指定,当视图不存在时不会抛出异常。
-
view_identifier
指定要删除的视图名。视图名可以选择性地与数据库名修饰。
语法:
[ database_name. ] view_name
案例
-- Assumes a view named `employeeView` exists.
DROP VIEW employeeView;
-- Assumes a view named `employeeView` exists in the `userdb` database
DROP VIEW userdb.employeeView;
-- Assumes a view named `employeeView` does not exist.
-- Throws exception
DROP VIEW employeeView;
Error: org.apache.spark.sql.AnalysisException: Table or view not found: employeeView;
(state=,code=0)
-- Assumes a view named `employeeView` does not exist,Try with IF EXISTS
-- this time it will not throw exception
DROP VIEW IF EXISTS employeeView;
REPAIR TABLE:修复表
描述
REPAIR TABLE
恢复表目录中的所有分区,并更新 Hive metastore。使用 PARTITIONED BY
子句创建表时,会在 Hive metastore 中生成和注册分区。但是,如果分区表是从现有数据创建的,分区不会自动在 Hive metastore 中注册。用户需要运行 REPAIR TABLE
来注册分区。在不存在的表或不包含分区的表上运行 REPAIR TABLE
会抛出异常。恢复分区的另一种方法是使用 ALTER TABLE RECOVER PARTITIONS
。为了兼容 Hive,该命令也可以通过 MSCK REPAIR TABLE
调用。
如果表被缓存,该命令会清除表及所有依赖它的表的缓存数据。当下次访问表或依赖表时,缓存将懒加载。
语法
[MSCK] REPAIR TABLE table_identifier [{ADD|DROP|SYNC} PARTITIONS]
参数
-
table_identifier
指定要修复的表的名称。表名可以选择性地包含数据库名称。
语法:[ database_name. ] table_name
-
{ADD|DROP|SYNC} PARTITIONS
指定如何恢复分区。如果未指定,则默认为ADD。
-
ADD,该命令将新分区添加到会话目录,用于基表文件夹中不属于任何表分区的所有子文件夹。 -
DROP,该命令删除会话目录中所有在文件系统中不存在位置的分区。 -
SYNC是DROP和ADD的组合。
案例
-- create a partitioned table from existing data /tmp/namesAndAges.parquet
CREATE TABLE t1 (name STRING, age INT) USING parquet PARTITIONED BY (age)
LOCATION "/tmp/namesAndAges.parquet";
-- SELECT * FROM t1 does not return results
SELECT * FROM t1;
-- run REPAIR TABLE to recovers all the partitions
REPAIR TABLE t1;
-- SELECT * FROM t1 returns results
SELECT * FROM t1;
+-------+---+
| name|age|
+-------+---+
|Michael| 20|
+-------+---+
| Justin| 19|
+-------+---+
| Andy| 30|
+-------+---+
TRUNCATE TABLE:截断表
描述
TRUNCATE TABLE
语句会删除表或分区的所有行。该表不能是视图或外部/临时表。为了一次截断多个分区,用户可以在partition_spec
中指定分区。如果未指定partition_spec
,则会删除表中的所有分区。
如果表被缓存,该命令会清除表及其所有引用它的依赖项的缓存数据。当下次访问表或依赖项时,缓存将在需要时被懒惰地填充。
语法
TRUNCATE TABLE table_identifier [ partition_spec ]
参数
-
table_identifier
指定一个表名,可以选择性地带有数据库名称。
语法:[ database_name. ] table_name
-
partition_spec
一个可选参数,用于指定分区的逗号分隔的键值对列表。
语法:PARTITION ( partition_col_name = partition_col_val [ , ... ] )
案例
-- Create table Student with partition
CREATE TABLE Student (name STRING, rollno INT) PARTITIONED BY (age INT);
SELECT * FROM Student;
+----+------+---+
|name|rollno|age|
+----+------+---+
| ABC| 1| 10|
| DEF| 2| 10|
| XYZ| 3| 12|
+----+------+---+
-- Removes all rows from the table in the partition specified
TRUNCATE TABLE Student partition(age=10);
-- After truncate execution, records belonging to partition age=10 are removed
SELECT * FROM Student;
+----+------+---+
|name|rollno|age|
+----+------+---+
| XYZ| 3| 12|
+----+------+---+
-- Removes all rows from the table from all partitions
TRUNCATE TABLE Student;
SELECT * FROM Student;
+----+------+---+
|name|rollno|age|
+----+------+---+
+----+------+---+
USE DATABASE:设置数据库
描述
USE
语句用于设置当前数据库。设置当前数据库后,SQL中引用的未经限定的数据库元素,如表、函数和视图,将从当前数据库中解析。默认数据库名称为"default"。
语法
USE database_name
参数
database_name
要使用的数据库的名称。如果数据库不存在,将引发异常。
案例
-- Use the 'userdb' which exists.
USE userdb;
-- Use the 'userdb1' which doesn't exist
USE userdb1;
Error: org.apache.spark.sql.catalyst.analysis.NoSuchDatabaseException: Database 'userdb1' not found;
(state=,code=0)
发表评论