学习目标: . 掌握数据库的基本操作,能够灵活使用HiveQL语句对Hive中的数据库进行创建、 查询、显示信息、切换、修改以及删除的操作。 . 了解CREATETABLE句式语法,能够描述CREATETABLE句式中不同子句的 作用。 . 掌握数据表的基本操作,能够灵活使用HiveQL语句对Hive中的数据表进行创建、 查看、修改和删除的操作。 . 掌握分区表的基本操作,能够灵活使用HiveQL语句对Hive中的分区表进行创建、 查询、添加、重命名、移动和删除的操作。 . 掌握分桶表的基本操作,能够灵活使用HiveQL语句对Hive中的分桶表进行创建 和查看信息的操作。 . 掌握临时表的基本操作,能够灵活使用HiveQL语句在Hive中创建临时表。 . 掌握视图的基本操作,能够灵活使用HiveQL语句对Hive中的视图进行创建、查 看、修改以及删除的操作。 . 了解索引的原理,能够描述Hive中索引的作用与优势。 . 掌握索引的基本操作,能够灵活使用HiveQL语句对Hive数据表中的索引进行创 建、查看、重建和删除的操作。 Hive提供了用于定义数据表结构和数据库对象的语言,称为数据定义语言(简称 DDL)。接下来,本章针对Hive的数据定义语言(DDL)进行详细讲解。 3.1 数据库的基本操作 3.1.1 创建数据库 Hive中创建数据库的语法格式如下。 CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value, ...)]; 第3章 Hive的数据定义语言 77 上述语法的具体讲解如下。 . CREATE (DATABASE|SCHEMA):表示创建数据库的语句,其中DATABASE 和SCHEMA 含义相同,可以切换使用。 .IFNOTEXISTS:可选,用于判断创建的数据库是否已经存在,若不存在则创建数 据库,反之不创建数据库。 . database_name:表示创建的数据库名称。 . COMMENTdatabase_comment:可选,表示数据库的相关描述。 . LOCATIONhdfs_path:可选,用于指定数据库在HDFS上的存储位置,默认存储 位置取决于Hive配置文件hive-site.xml中参数hive.metastore.warehouse.dir指定 的存储位置。 . WITH DBPROPERTIES(property_name=property_value,...):可选,用于设置 数据库属性,其中property_name表示属性名称,该名称可以自定义;property_ value表示属性值,该值可以自定义。 接下来,在Hive客户端工具Beeline中创建数据库itcast,并指定数据库文件存放在 HDFS的/hive_db/create_db/目录中,具体命令如下。 CREATE DATABASE IF NOT EXISTS itcast COMMENT "This is itcast database" LOCATION '/hive_db/create_db/' WITH DBPROPERTIES ("creator"="itcast", "date"="2020-08-08"); 上述命令中,添加了数据库描述和数据库属性,其中数据库描述为Thisisitcast database;数据库属性为creator和date,这两个属性对应的值分别是itcast和2020-08-08。 3.1.2 查询数据库 Hive中查询数据库的语法格式如下所示。 SHOW (DATABASES|SCHEMAS) [LIKE 'identifier_with_wildcards']; 上述语法的具体讲解如下。 . SHOW (DATABASES|SCHEMAS):表示查询数据库的语句,其中DATABASE 和SCHEMA 含义相同,可以切换使用。 . LIKEi'dentifier_with_wildcards':可选,LIKE子句用于模糊查询,identifier_with_ wildcards用于指定查询条件。 接下来,查询Hive中所有数据库,具体命令如下。 SHOW DATABASES; 如果要查询Hive中数据库名称的首字母是i的数据库,具体命令如下。 SHOW DATABASES LIKE 'i*'; Hive数据仓78 库应用 上述命令在Hive客户端工具Beeline的执行效果如图3-1所示。 图3-1 查询Hive所有数据库和指定数据库 3.1.3 查看数据库信息 Hive中查看数据库信息的语法格式如下所示。 DESCRIBE|DESC (DATABASES|SCHEMAS) [EXTENDED] db_name; 上述语法的具体讲解如下。 . DESCRIBE|DESC (DATABASES|SCHEMAS):表示查询数据库信息的语句,其 中DESCRIBE和DESC含义相同,可以切换使用。 . EXTENDED:可选,在查询数据库的信息中显示属性。 . db_name:用于指定查询的数据库名称。 接下来,查看Hive中数据库itcast的信息,具体命令如下。 DESC DATABASE EXTENDED itcast; 上述命令在Hive客户端工具Beeline的执行效果如图3-2所示。 图3-2 查看数据库itcast的信息 在图3-2中,数据库itcast中的信息包含6个字段。其中,db_name表示数据库名称, comment表示数据库描述,location表示数据库在HDFS上的存储位置,owner_name表示 第3章 Hive的数据定义语言 79 数据库所有者名称,owner_type表示数据库所有者类型,parameters表示数据库属性。 3.1.4 切换数据库 使用Hive客户端工具Beeline或者HiveCLI操作Hive时,默认打开的数据库是 default。如果使用已创建的其他数据库,则需要手动切换。Hive中切换数据库的语法格式 如下所示。 USE db_name; 上述语法的具体讲解如下。 . USE:表示切换数据库的语句。 . db_name:用于指定要切换的数据库名称。 例如,将当前使用的数据库切换至数据库itcast,具体命令如下。 USE itcast; 上述命令在Hive客户端工具Beeline执行后,使用SELECT语句查看当前使用的数据 库,具体如图3-3所示。 图3-3 查看当前使用的数据库 从图3-3可以看出,第一次使用SELECT 语句查看当前使用的数据库时显示的是 default,通过USE语句将当前使用的数据库切换到itcast之后,再次使用SELECT 语句查 看当前使用的数据库时显示的是itcast,证明当前使用的数据库由default切换到itcast。需 要注意的是,在使用Hive客户端工具操作Hive时,一定要确认当前使用的数据库是否正 确,避免将数据存储在错误的数据库中。 3.1.5 修改数据库 在Hive中可以修改数据库信息中的属性和所有者,修改数据库信息的语法格式如下 所示。 Hive数据仓80 库应用 /*修改数据库属性*/ ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...); /*修改数据库所有者*/ ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role; 上述语法的具体讲解如下。 . ALTER (DATABASE|SCHEMA): 表示修改数据库信息的语句,其中 DATABASE和SCHEMA 含义相同,可以切换使用。 . database_name:指定数据库名称。 . SETDBPROPERTIES(property_name=property_value,...):指定修改数据库信 息中的属性,在修改数据库信息的属性时,若属性已经存在则覆盖之前的属性值, 反之添加该属性。 . SETOWNER [USER|ROLE]user_or_role:指定修改数据库信息中的所有者。 接下来,修改数据库itcast中的属性,具体命令如下。 ALTER DATABASE itcast SET DBPROPERTIES ("date"="2020-08-18", "locale"="beijing"); 在Hive客户端工具Beeline中执行上述命令后,使用DESCRIBE查看修改后数据库 itcast的信息,具体如图3-4所示。 图3-4 查看修改后数据库itcast的信息 通过对比图3-2和图3-4可以看出,图3-4展示的数据库itcast信息中,属性date的值 由2020-08-08更改为2020-08-18,增加了属性locale。 3.1.6 删除数据库 Hive中删除数据库的语法格式如下所示。 DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE]; 上述语法的具体讲解如下。 . DROP(DATABASE|SCHEMA):表示删除数据库的语句,其中DATABASE 和 SCHEMA 含义相同,可以切换使用。 .IFEXISTS:可选,用于判断数据库是否存在。 . database_name:用于指定数据库名称。 第3章 Hive的数据定义语言 81 . [RESTRICT|CASCADE]:可选,表示数据库中存在表时是否可以删除数据库。默 认值为RESTRICT,表示如果数据库中存在表则无法删除数据库。若使用 CASCADE,表示即使数据库中存在表,仍然会删除数据库并删除数据库中的表,因 此需要谨慎使用CASCADE。 接下来,删除数据库itcast,具体命令如下。 DROP DATABASE IF EXISTS itcast; 上述命令在Hive客户端工具Beeline执行后,查询Hive中所有数据库,具体如图3-5 所示。 图3-5 查询Hive中所有数据库 从图3-5可以看出,Hive中的数据库只有default和test,已经不存在数据库itcast,证 明成功删除了数据库itcast。 3.2 数据表的基本操作 3.2.1 CREATETABLE句式分析 Hive中使用CREATETABLE 句式创建数据表,CREATETABLE 句式的语法格式如下。 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [COMMENT col_comment], ... [constraint_specification])] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [SKEWED BY (col_name, col_name, ...)] ON ((col_value, col_value, ...), (col_value, col_value, ...), ...) [STORED AS DIRECTORIES] [ [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] ] Hive数据仓82 库应用 [LOCATION hdfs_path] [TBLPROPERTIES (property_name=property_value, ...)] [AS select_statement]; 上述语法的具体讲解如下。 . TEMPORARY:可选,用于指定创建的表为临时表。 . EXTERNAL:可选,用于指定创建的表为外部表,若不指定则默认创建内部表。 .IFNOTEXISTS:可选,用于判断创建的表是否存在。 . db_name:可选,用于指定创建表时存放的数据库,若不指定则默认在当前数据库 创建。 .table_name:指定表名称。 .col_name:指定表中的字段名称,若创建的数据表是空表,则col_name为可选的。 . data_type:指定字段类型,若创建的数据表是空表,则data_type为可选的。 . COMMENTcol_comment:可选,指定字段描述。 .constraint_specification:可选,指定字段约束,支持Hive3.0及以上版本。 . COMMENTtable_comment:可选,指定字段描述。 . PARTITIONEDBY (col_namedata_type[COMMENTcol_comment],...)]:可 选,用于创建分区表,指定分区名(col_name)、分区类型(data_type)和分区描述(col _comment)。 . [CLUSTEREDBY (col_name,col_name,...)[SORTEDBY (col_name[ASC| DESC],...)]INTOnum_bucketsBUCKETS]:可选,用于创建分桶表,指定分桶 的字段(col_name)、根据指定字段对桶内的数据进行升序(ASC,默认)或降序 (DESC)排序以及桶的数量(num_buckets)。 . [SKEWEDBY (col_name,col_name,...)]ON ((col_value,col_value,...),(col_ value,col_value,...),...)[STOREDASDIRECTORIES]:可选,用于创建倾斜 表解决Hive中数据倾斜问题,其中SKEWEDBYcol_name指定出现数据倾斜的字 段,ON col_ value 指定数据倾斜字段中数据倾斜的值,STORED AS DIRECTORIES将数据倾斜字段中出现频繁的值拆分成文件夹,若不指定则拆分成 文件。 . ROW FORMATrow_format:可选,用于序列化行对象。 . STOREDASfile_format:可选,用于创建表时指定Hive表的文件存储格式。 . LOCATIONhdfs_path:可选,用于指定Hive表在HDFS的存储位置。 . TBLPROPERTIES (property_name=property_value,...):可选,用于指定表 属性。 . ASselect_statement:可选,用于在创建表的同时将查询结果插入表中。 通过对上述创建数据库表CREATETABLE句式的学习,读者对Hive中创建数据库 表的方式有了初步认识,本章后续的内容会详细讲解CREATETABLE句式的实际应用。 多学一招:Serde和表属性 1.Serde Serde是SerializerandDeserializer(序列化和反序列化)的简称,Hive通过Serde处理 第3章 Hive的数据定义语言 83 Hive数据表中每一行数据的读取和写入,例如查询Hive数据表数据时,HDFS中存放的数 据表数据会通过Serializer序列化为字节流便于数据传输;向Hive数据表插入数据时,会通 过Deserializer将数据反序列化成Hive数据表的每一行值,方便将数据加载到数据表中,不 需要对数据进行转换。 Hive中的Serde分为自定义Serde和内置Serde,其中使用自定义Serde时需要在 CREATETABLE句式中指定ROW FORMAT 子句的row_format值为Serde,并根据 Serde类型指定实现类;内置Serde需要在CREATETABLE句式中指定ROW FORMAT 子句的row_format值为DELIMITED。Hive中常用的自定义Serde和内置Serde如表3-1 和表3-2所示。 表3-1 常用的自定义Serde 自定义Serde 介 绍 ROW FORMATSERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITHSERDEPROPERTIES ( "input.regex"="regex" ) STOREDASTEXTFILE; 使用正则表达式序列化/反序列 化数据表的每一行数据,其中 regex用于指定正则表达式 ROW FORMATSERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STOREDASTEXTFILE 使用JSON 格式序列化/反序列 化数据表的每一行数据 CREATETABLEmy_table(astring,bstring,...) ROW FORMATSERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITHSERDEPROPERTIES( "separatorChar"="\t", "quoteChar" =""' , "escapeChar" ="\\" ) STOREDASTEXTFILE; 使用CSV 格式序列化/反序列化 数据表的每一行数据,其中 separatorChar用于指定CSV 文 件的分隔符;quoteChar用于指定 CSV 文件的应用符;escapeChar 用于指定CSV文件的转义符 表3-2 常用的内置Serde 内置Serde 介 绍 FIELDSTERMINATEDBYchar[ESCAPED BYchar] FIELDSTERMINATED 指定字段分隔符;ESCAPED 指定转义符,避免数据中存在与字段分隔符一样的字 符,造成混淆 COLLECTION ITEMS TERMINATED BYchar 指定集合中元素的分隔符,集合包含数据类型为 MAP、ARRAY和STRUCT MAPKYSTERMINATEDBYchar 指定MAP中Key和Value的分隔符 LINESTERMINATEDBYchar 指定行分隔符 NULLDEFINEDASchar 自定义空值格式,Hive默认为\' N' 8 4 Hive数据仓库应用 2.表属性 通过CREATETABLE句式创建数据表时可以使用TBLPROPERTIES子句指定表 属性,Hive表属性分为自定义属性和预定义属性,其中使用自定义属性时,用户可以自定义 属性名称(property_name)和属性值(property_value),用于为创建的数据表指定自定义标 签,例如指定创建表的作者、创建表的时间等;使用预定义属性时,需要根据Hive规定的属 性名称和属性值使用,用于为创建的数据表指定相关配置,有关Hive预定义属性如表3-3 所示。 表3- 3 Hive预定义属性 属性值描述 comment table_comment 表描述 hbase.table.name table_name 集成HBase immutable true或false 防止意外更新,若为true,则无法通过Insert 实现数据的更新和插入 orc.compres ZLIB或SNAPPY 或NONE 指定ORC压缩方式 transactional true或false 指定表是否支持ACID(更新、插入、删除) NO_AUTO_COMPACTION true或false 表事务属性,指定表是否支持自动紧缩 compactor.mapreduce.map.memory.mb mapper_memory 表事务属性,指定紧缩map(内存/MB)作业 的属性 compactorthreshold.hive .compactor.delta.num.threshold threshold_num 表事务属性,如果有超过threshold_num个 增量目录,则触发轻度紧缩 compactorthreshold.hive .compactor.delta.pct.threshold auto.purge threshold_pct true或false 表事务属性,如果增量文件的大小与基础文 件的大小比率大于threshold_pct(区间为 0~1),则触发深度紧缩 若为true,则删除或者覆盖的数据会不经过 回收站直接被删除 EXTERNAL true或false 内部表和外部表的转换 3.2.数据表简介 2 数据表是Hive存储数据的基本单位,Hive数据表主要分为内部表(又叫托管表)和外 部表,以内部表和外部表为基础可以创建分区表或分桶表,即内/外部分区表或内/外部分桶 表。接下来,针对内部表和外部表进行详细讲解。 默认情况下,内部表和外部表的数据都存储在Hive配置文件中参数hive.metastore. waeos.ir指定的路径。它们的区别在于删除内部表时,内部表的元数据和数据会一同 rhued 删除;而删除外部表时,只删除外部表的元数据,不会删除数据。外部表相对来说更加安全, 数据组织更加灵活并且方便共享源数据文件。 3.2.创建数据表 3 在虚拟机Node_03中使用Hive客户端工具Beline,远程连接虚拟机Node_02的 第3章 Hive的数据定义语言 85 HiveServer2服务操作Hive。在Hive中创建一个数据库hive_database,并在该数据库中通 过CREATETABLE句式创建内部表managed_table和外部表external_table。 (1)创建内部表managed_table的命令如下。 CREATE TABLE IF NOT EXISTS hive_database.managed_table( staff_id INT COMMENT "This is staffid", staff_name STRING COMMENT "This is staffname", salary FLOAT COMMENT "This is staff salary", hobby ARRAY<STRING> COMMENT "This is staff hobby", deductions MAP<STRING, FLOAT> COMMENT "This is staff deduction", address STRUCT<street:STRING,city:STRING> COMMENT "This is staff address" ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '_' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n' STORED AS textfile TBLPROPERTIES("comment"="This is a managed table"); 上述命令中,指定ROW FORMATDELIMITED子句使用Hive内置的Serde,自定义 字段(FIELDS)分隔符为“,”;自定义集合元素(COLLECTIONITEMS)的分隔符为“_”;自 定义MAP(MAPKEYS)的键值对分隔符为“:”;自定义行(LINES)分隔符为\n。 (2)创建外部表external_table的命令如下。 CREATE EXTERNAL TABLE IF NOT EXISTS hive_database.external_table ( staff_id INT COMMENT "This is staffid", staff_name STRING COMMENT "This is staffname", salary FLOAT COMMENT "This is staff salary", hobby ARRAY<STRING> COMMENT "This is staff hobby", deductions MAP<STRING, FLOAT> COMMENT "This is staff deduction", address STRUCT<street:STRING,city:STRING> COMMENT "This is staff address" ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '_' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n' STORED AS textfile LOCATION '/user/hive_external/external_table/' TBLPROPERTIES("comment"="This is a external table"); 上述命令中,通过在CREATETABLE句式中指定EXTERNAL子句创建外部表。创 建外部表时通常配合LOCATION 子句指定数据的存储位置,便于数据的维护与管理。 Hive数据仓86 库应用 3.2.4 查看数据表 Hive提供了查看当前数据库的所有数据表以及查看指定数据表结构信息的语句,具体 语法格式如下。 /*显示出当前数据库的所有数据表*/ SHOW TABLES [LIKE 'identifier_with_wildcards']; /*查看指定数据表结构信息*/ DESCRIBE|DESC [FORMATTED] table_name; 上述语法的具体讲解如下。 . SHOW TABLES:表示查看当前数据库的所有数据表。 . LIKEi'dentifier_with_wildcards':可选,LIKE子句用于模糊查询,identifier_with_ wildcards用于指定查询条件。 . DESCRIBE|DESC:表示查询指定数据表基本结构信息,其中DESCRIBE和DESC 含义相同,可以切换使用。 . FORMATTED:可选,表示查询指定数据表详细结构信息。 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 的HiveServer2服务操作Hive,讲解查看数据表语法的实际应用,具体操作步骤如下。 (1)切换到数据库hive_database,具体命令如下。 USE hive_database; (2)查看数据库hive_database的所有数据表,具体命令如下。 SHOW TABLES; 上述命令在Hive客户端工具Beeline中的执行效果如图3-6所示。 图3-6 查看数据库hive_database的所有数据表 从图3-6可以看出,数据库hive_database中包含两个表,其中表external_table是3.2.3 小节创建的外部表;表managed_table是3.2.3小节创建的内部表。 (3)通过模糊查询查看数据库hive_database中数据表名称首字母为m 的数据表,具体 第3章 Hive的数据定义语言 87 命令如下。 SHOW TABLES LIKE 'm*'; 上述命令在Hive客户端工具Beeline中的执行效果如图3-7所示。 图3-7 查看数据表名称首字母为m 的数据表 从图3-7可以看出,数据库hive_database中数据表名称首字母为m 的数据表只有 managed_table。 (4)查看数据库hive_database中内部表managed_table表结构的基本信息,具体命令如下。 DESC managed_table; 上述命令在Hive客户端工具Beeline中的执行效果如图3-8所示。 图3-8 查看内部表managed_table表结构的基本信息 从图3-8可以看出,内部表managed_table表结构的基本信息包含字段名称(col_ name)、字段数据类型(data_type)和字段描述(comment)。 (5)查看数据库hive_database中外部表external_table表结构的详细信息,具体命令 如下。 DESC FORMATTED external_table; Hive数据仓88 库应用 上述命令在Hive客户端工具Beeline中的执行效果如图3-9所示。 图3-9 查看外部表external_table表结构的详细信息 从图3-9可以看出,外部表external_table表结构的详细信息中不仅包含了col_name (字段)的相关信息,而且还包含了DetailedTableInformation(表详细信息)和storage Information(存储信息)。 3.2.5 修改数据表 修改数据表结构信息使用ALTERTABLE语句实现,该语句只是修改数据表的元数 据信息,数据表中的数据不会随之发生变化。下面介绍几种修改数据表结构信息的方法。 1.重命名数据表 重命名数据表是指修改数据表的名称,语法格式如下。 ALTER TABLE table_name RENAME TO new_table_name; 上述语法的具体讲解如下。 . ALTERTABLE:表示修改数据表结构信息的语句。 . RENAMETO:用于数据表的重命名操作。 .table_name:指定需要重命名的数据表名称。 . new_table_name:指定重命名后的数据表名称。 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 第3章 Hive的数据定义语言 89 的HiveServer2服务操作Hive,将数据库hive_database的内部表managed_table重命名为 managed_table_new,具体命令如下。 ALTER TABLE managed_table RENAME TO managed_table_new; 上述命令执行完成后,在Hive客户端工具Beeline中执行“SHOW TABLES;”命令,查 看数据库hive_database的所有数据表,如图3-10所示。 图3-10 查看数据库hive_database的所有数据表 从图3-10可以看出,数据库hive_database中原有的内部表managed_table已经重命名 为managed_table_new。 2.修改数据表的属性 修改数据表属性的语法格式如下。 ALTER TABLE table_name SET TBLPROPERTIES(property_name = property_value, property_name = property_value, ... ); 上述语法的具体讲解如下。 . ALTERTABLE:表示修改数据表结构信息的语句。 . SETTBLPROPERTIES:表示修改数据表属性的操作。 .table_name:指定需要修改属性的数据表名称。 . property_name = property_value:指定修改的属性(property_name)和属性值 (property_value)。 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 的HiveServer2服务操作Hive,修改内部表managed_table_new 的属性comment,具体命 令如下。 ALTER TABLE managed_table_new SET TBLPROPERTIES("comment"="This is a new managed table"); 上述命令执行完成后,在Hive客户端工具Beeline中执行“DESC FORMATTED managed_table_new;”命令,查看数据库hive_database中内部表managed_table_new 表结 构的详细信息,如图3-11所示。 Hive数据仓90 库应用 图3-11 查看内部表managed_table_new 表结构的详细信息 从图3-11可以看出,内部表managed_table_new 属性comment的属性值由原始的 Thisisamanagedtable修改为Thisisanew managedtable。 3.修改数据表列 修改数据表列是指修改数据表中列的名称、描述、数据类型或者列的位置,语法格式如下。 ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_ comment] [FIRST|AFTER column_name]; 上述语法的具体讲解如下。 . ALTERTABLE:表示修改数据表结构信息的语句。 . CHANGE [COLUMN]:用于修改数据表列的操作,其中COLUMN 为可选。 .table_name:指定需要修改列的数据表名称。 .col_old_name:指定需要修改的列名。 .col_new_name:指定列名被修改后的新列名。 .column_type:指定列修改后的字段类型。需要注意的是,指定列修改后的字段类 型与原始字段类型之间需要符合Hive的强制类型转换规则。 . COMMENTcol_comment:可选,修改列的描述。 . FIRST|AFTERcolumn_name:可选,指定列修改后的位置。FIRST 表示在第一 列,AFTER表示在column_name之后,其中column_name表示已经存在的列。需 要注意的是,如果表中每个列的数据类型不一致,则无法使用该功能。 第3章 Hive的数据定义语言 91 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 的HiveServer2服务操作Hive,讲解修改数据表列语法的实际应用,具体操作步骤如下。 (1)为了便于演示修改列位置及列类型的操作,这里在数据库hive_database中创建数 据表alter_managed_table,该表中所有列的数据类型一致,具体命令如下。 CREATE TABLE IF NOT EXISTS alter_managed_table( id STRING, sex STRING, name STRING); (2)修改数据库hive_database中数据表alter_managed_table的列sex,首先重命名列 sex为gender,然后移动列gender的位置到列name的后边,最后修改列gender的描述为 “Thisisgender”,具体命令如下。 ALTER TABLE alter_managed_table CHANGE sex gender STRING COMMENT "This is gender" AFTER name; (3)修改数据库hive_database中内部表alter_managed_table的列gender,将列的数据 类型由STRING修改为VARCHAR(30),具体命令如下。 ALTER TABLE alter_managed_table CHANGE gender gender VARCHAR(30); (4)在Hive客户端工具Beeline中执行“DESCalter_managed_table;”命令,查看数据 库hive_database中数据表alter_managed_table表结构的基本信息,如图3-12所示。 图3-12 查看数据表alter_managed_table表结构的基本信息(1) 从图3-12可以看出,数据表alter_managed_table的列sex重命名为gender,数据类型 由string修改为varchar(30),位置由列name之前移动到了列name之后,由无描述修改描 述为Thisisgender。 4.添加数据表列 添加数据表列会在数据表的尾部添加指定列,语法格式如下。 ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...) Hive数据仓92 库应用 上述语法的具体讲解如下。 . ALTERTABLE:表示修改数据表结构信息的语句。 . ADDCOLUMNS:用于向数据表中添加列。 .table_name:指定需要添加列的数据表名称。 .col_name:指定需要添加的列名。 . data_type:指定需要添加列的数据类型。 . COMMENTcol_comment:指定需要添加列的描述。 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 的HiveServer2服务操作Hive,在数据表alter_managed_table中添加列,具体命令如下。 ALTER TABLE alter_managed _table ADD COLUMNS (age INT COMMENT "This is age", phone STRING COMMENT "This is phone"); 上述命令中,在数据表alter_managed_table中添加列age,指定列age的数据类型为 INT并指定列描述为“Thisisage”;在数据表alter_managed_table中添加列phone,指定列 phone的数据类型为STRING并指定列描述为“Thisisphone”。 上述命令执行完成后,在Hive客户端工具Beeline中执行“DESCalter_managed_ table;”命令,查看数据库hive_database中数据表alter_managed_table表结构的基本信息, 如图3-13所示。 图3-13 查看数据表alter_managed_table表结构的基本信息(2) 从图3-13可以看出,内部表alter_managed_table由原始的3列增加为5列,新增的2 列分别是列age和列phone。 5.替换数据表列 替换数据表列是指替换当前数据表中的所有列,语法格式如下。 ALTER TABLE table_name REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) 上述语法的具体讲解如下。 . ALTERTABLE:表示修改数据表结构信息的语句。 第3章 Hive的数据定义语言 93 . REPLACECOLUMNS:用于替换数据表中已存在的所有列。 .table_name:指定需要替换列的数据表名称。 .col_name:指定替换列的列名。 . data_type:指定替换列的数据类型。 . COMMENTcol_comment:指定替换列的描述。 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 的HiveServer2服务操作Hive,替换数据表alter_managed_table的列,具体命令如下。 ALTER TABLE alter_managed_table REPLACE COLUMNS (username STRING COMMENT "This is username", password STRING COMMENT "This is password"); 上述命令中,将数据表alter_managed_table中的所有列替换为列username和列 password。 上述命令执行完成后,在Hive客户端工具Beeline中执行“DESCalter_managed_ table;”命令,查看数据库hive_database中数据表alter_managed_table表结构的基本信息, 如图3-14所示。 图3-14 查看数据表alter_managed_table表结构的基本信息(3) 从图3-14可以看出,数据表alter_managed_table中只包含两列,即列username和列 password。 多学一招:Hive中强制数据类型转换规则 在Hive中执行修改列的数据类型操作时只能按照强制数据类型转换规则进行修改, Hive的强制数据类型转换规则如图3-15所示。 图3-15 Hive的强制数据类型转换规则 Hive数据仓94 库应用 从图3-15可以看出,string类型数据可以转换为double、decimal、string和varchar这4 种数据类型。 3.2.6 删除数据表 删除数据表的语法格式如下。 DROP TABLE [IF EXISTS] table_name [PURGE]; 上述语法的具体讲解如下。 . DROPTABLE:表示删除数据表的语句。 .IFEXISTS:可选,用于判断要删除的数据表是否存在。 .table_name:表示要删除的数据表名称。 . PURGE:可选,当删除内部表时,若使用PURGE,则内部表的数据不会放入回收 站,后续无法通过回收站恢复内部表的数据,反之,内部表的数据会放入回收站,这 里指的恢复数据不包含元数据,元数据删除后无法恢复。 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 的HiveServer2服务操作Hive,删除数据库hive_database的数据表alter_managed_table, 具体命令如下。 DROP TABLE IF EXISTS alter_managed_table PURGE; 上述命令中,通过PURGE子句指定数据表alter_managed_table删除后的数据不放入 回收站。 上述命令执行完成后,在Hive客户端工具Beeline中执行“SHOW TABLES;”命令,查 看数据库hive_database中的所有数据表,如图3-16所示。 图3-16 查看数据库hive_database中的所有数据表 从图3-16可以看出,数据库hive_database中只有数据表external_table和managed_ table_new,说明数据表alter_managed_table成功从数据库hive_database中删除了。 多学一招:回收站 Hive中的回收站是通过HDFS的Trash功能实现,Trash功能可以将HDFS中删除的 第3章 Hive的数据定义语言 95 文件放入回收站目录(默认回收站目录/user/root/.Trash/Current,其中回收站目录中的 root会根据当前操作HDFS的用户名而变化),防止用户意外删除文件,出现无法找回的情 况。Hive内部表的数据存放在HDFS中,并且删除内部表时数据也会一同被删除,所以为 了防止用户意外删除Hive内部表造成数据丢失的情况,可以在删除内部表的语句中指定 PURGE,将删除的内部表数据放入回收站目录,后续复制回收站目录中删除的内部表数据 即可。 HDFS默认情况下并没有开启Trash功能,需要在Hadoop的配置文件core-site.xml 的<configuration/>标签中添加如下配置内容。 <property> <name>fs.trash.interval</name> <value>1440</value> </property> <property> <name>fs.trash.checkpoint.interval</name> <value>60</value> </property> 上述配置内容中,参数fs.trash.interval表示回收站目录中文件保存的时间,该参数的 默认值为0(分钟),也就是不保存,这里指定参数值为1440,也就是被删除的文件会在回收 站目录保存一天;参数fs.trash.checkpoint.interval表示NameNode检查回收站目录间隔的 时长,这里指定参数值为60,也就是NameNode每间隔一小时检查一次回收站目录,永久删 除回收站目录中存放时长超过一天的文件。 在3台虚拟机Node_01、Node_02和Node_03的Hadoop配置文件core-site.xml中分 别添加上述内容,添加完成后需要重新启动Hadoop集群使配置内容生效。 3.3 分区表 随着系统运行时间的增加,表的数据量会越来越大,而Hive查询数据通常是使用全表 扫描,这会导致对大量不必要数据的扫描,从而降低查询效率。为了解决这一问题,Hive引 进了分区技术,分区主要是将表的整体数据根据业务需求,划分成多个子目录进行存储,每 个子目录对应一个分区。通过扫描分区表中指定分区的数据,避免Hive全表扫描,从而提 升Hive查询数据的效率。本节针对Hive的分区表进行详细讲解。 3.3.1 创建分区表 由于分区表是基于内/外部表创建,所以分区表的创建方式和创建数据表的方式类似。 接下来,在虚拟机Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02 的HiveServer2服务操作Hive,在数据库hive_database中创建分区表partitioned_table,具 体命令如下。 CREATE TABLE IF NOT EXISTS hive_database.partitioned_table(