Hive DDL

Hive DDL,第1张

Hive DDL hive 4.0.0 修改表/分区/列 修改表 修改表名
ALTER TABLE old_table_name RENAME TO new_table_name;
从0.6版本开始,对内部表的重命名将移动其在HDFS的位置。从Hive 2.2.0 开始重命名已更改。
只有在没有 LOCATION 子句且在其数据库目录下创建表时,才会移动内部表的 HDFS 位置。 
0.6 之前的 Hive 版本只是在不移动 HDFS 位置的情况下重命名了 metastore 中的表。
修改表Properties
ALTER TABLE table_name SET TBLPROPERTIES table_properties;
 
table_properties:
  : (property_name = property_value, property_name = property_value, ... )
使用此语句将元数据添加到表中。 当前 last_modified_user、last_modified_time 属性由 Hive 自动添加和管理。 用户可以将自己的属性添加到此列表中。 执行 DESCRIBE EXTENDED TABLE 来获取此信息。
修改表注释
ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);
加入序列化属性
ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];
 
ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;
 
serde_properties:
  : (property_name = property_value, property_name = property_value, ... )
这些语句使您能够更改表的 SerDe 或将用户定义的元数据添加到表的 SerDe 对象。
当 Hive 初始化表以序列化和反序列化数据时,SERDEPROPERTIES 属性将传递给表的 SerDe。 因此,用户可以在此处自定义 SerDe 所需的任何信息。 
删除SerDe属性
ALTER TABLE table_name [PARTITION partition_spec] UNSET SERDEPROPERTIES (property_name, ... );

Hive 4.0.0开始支持此功能。

更改表的存储属性
ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
  INTO num_buckets BUCKETS;
此语句更改表的物理存储属性。
此命令只会修改 Hive 的元数据,不会重新组织或重新格式化现有数据。 用户应确保实际数据布局与元数据定义一致。
修改倾斜表
ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...)
  ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...] 
  [STORED AS DIRECTORIES];
STORED AS DIRECTORIES 选项确定倾斜表是否使用列表桶(list bucketing)功能,该功能为倾斜值创建子目录。
Skewed Table可以提高有一个或多个列有倾斜值的表的性能,通过指定经常出现的值(严重倾斜),hive将会在元数据中记录这些倾斜的列名和值,在join时能够进行优化。
修改表使不倾斜
ALTER TABLE table_name NOT SKEWED;
更改表使不作为目录存储
ALTER TABLE table_name NOT STORED AS DIRECTORIES;
这会关闭列表桶功能,尽管表仍是倾斜的。
更改表倾斜位置
ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );
这会更改列表桶的位置映射。
更改表约束

从Hive 2.1.0开始支持此功能。

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name NOT NULL ENABLE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name DEFAULT default_value ENABLE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name CHECK check_expression ENABLE;
 
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
修改表分区
从 Hive 1.2开始,如果属性 hive.typecheck.on.insert 设置为 true(默认值),则分区规范中指定的分区值将进行类型检查、转换和规范化以符合其列类型。 这些值可以是数字值。
增加分区
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)
使用 ALTER TABLE ADD PARTITION 向表添加分区。 仅当分区值是字符串时才应引用它们。 该位置必须是数据文件所在的目录。 
ADD PARTITION 更改表元数据,但不加载数据。如果在该分区的位置不存在数据,则查询不会返回任何结果。如果该表的 partition_spec 已存在,则会引发错误。 可以使用 IF NOT EXISTS 跳过错误。

单个 ALTER TABLE 中有多个 partition_spec 是正确的语法,但如果在 0.7 版中这样做,分区方案将失败。 也就是说,指定分区的每个查询将始终仅使用第一个分区。
example:

ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808'
                          PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809';

以上示例在 Hive 0.7 中静默失败且不会报错,并且所有查询都将仅转到 dt=‘2008-08-08’ 分区。需要写多条SQL语句来进行分区,如果是0.8和以后的版本则不需要。

动态分区

Hive中关于动态分区的一些配置:

-- Hive默认配置值
-- 开启或关闭动态分区,默认关闭
hive.exec.dynamic.partition=false;
-- 设置为nonstrict模式,让所有分区都动态配置,否则至少需要指定一个分区值
hive.exec.dynamic.partition.mode=strict;
-- 能被mapper或reducer创建的最大动态分区数,超出而报错
hive.exec.max.dynamic.partitions.pernode=100;
-- 一条带有动态分区SQL语句所能创建的最大动态分区总数,超过则报错
hive.exec.max.dynamic.partitions=1000;
-- 全局能被创建文件数目的最大值,通过Hadoop计数器跟踪,若超过则报错
hive.exec.max.created.files=100000;
分区重命名
ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
此语句可以更改分区列的值。 使用此语句来规范旧分区列值以符合其类型。在这种情况下,即使 hive.typecheck.on.insert 设置为 true(默认),旧 partition_spec 中的列值也不会启用类型转换和规范化,以字符串形式指定旧的partition_spec中的任何数据。
分区交换

分区能在表之间交换或者移动。

-- 将分区从 table_name _1 移动到 table_name _2
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1;
-- 将多个分区从 table_name _1 移动到 table_name _2
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;
此语句将分区中的数据从一个表移动到另一个具有相同架构但尚未具有该分区的表。
在 Hive metastore 中自动发现并同步分区的元数据。
分区发现

从Hive 4.0.0开始
创建外部分区表时,会自动添加“discover.partitions”=“true” 表属性。
对于内部分区表,可以手动添加“discover.partitions”表属性。
当 Hive metastore Service (HMS) 在远程服务模式下启动时,后台线程 (PartitionManagementTask) 会每 300 秒定期调度一次(可通过metastore.partition.management.task.frequency 进行配置),以查找“discover.partitions”属性设置为 true的表,并在同步模式下执行 msck 修复。 如果表是事务表,则在执行 msck 修复之前为该表获取排他锁。 就不需要在手动运行“MSCK REPAIR TABLE table_name SYNC PARTITIONS”。

分区保留

现在可以通过表属性“partition.retention.period”为表指定保留时间间隔。
当指定了保留时间间隔时,在 HMS 中运行的后台线程将检查分区的年龄(创建时间),如果分区的年龄超过保留期,它将被删除。在保留期结束后删除分区也会删除该分区中的数据。 例如,一个使用表属性“discover.partitions”=“true”和“partition.retention.period”=“7d”创建具有“date”分区的外部分区表,则仅保留过去 7 天内创建的分区 .

分区恢复

Hive 将每个表的分区列存储在metastore中。 但是,如果将新分区直接添加到 HDFS(例如通过使用 hadoop fs -put 命令)或从 HDFS 中删除,除非用户运行 ALTER TABLE table_name,否则metastore(以及 Hive)不会知道这些分区信息的更改。
分别在每个新添加或删除的分区上执行 ADD/DROP PARTITION 命令。
但是,用户可以运行 metastore 检查命令来修复表分区:

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
这会将有关分区的元数据更新到 Hive metastore 中,以针对不存在此类元数据的分区。 

MSC命令的默认选项是 ADD PARTITIONS。 使用此选项,它会将 HDFS 上存在但不在 metastore 中的分区添加到 metastore中。 DROP PARTITIONS 选项将从 metastore 中删除分区信息,该分区已从 HDFS 中删除。 SYNC PARTITIONS 选项等效于调用 ADD 和 DROP PARTITIONS。 

当有大量未被跟踪的分区时,可以批量运行 MSCK REPAIR TABLE 以避免 OOME(Out of Memory Error)。 通过属性 `hive.msck.repair.batch.size` 配置批处理大小。 该属性的默认值为零,意味着它将一次执行所有分区。 不带 REPAIR 选项的 MSCK 命令可用于查找有关元数据不匹配 metastore 的详细信息。

从 Hive 1.3 开始,如果在 HDFS 上发现分区值中包含不允许字符的目录,MSCK 将抛出异常。 使用客户端上的 hive.msck.path.validation 设置来改变这种行为; “跳过”将简单地跳过目录。 “忽略”无论如何都会尝试创建分区(旧行为)。 这可能有效,也可能无效。
删除分区
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
  [IGNORE PROTECTION] [PURGE];            -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)
使用 ALTER TABLE DROP PARTITION 删除表的分区。 这将删除此分区的数据和元数据。

如果配置了 Trash,数据实际上会移动到 .Trash/Current 目录,如果指定 了PURGE,则数据会直接删除。元数据完全丢失。

IGNORE PROTECTION 在 2.0.0 及更高版本中不再可用。 此功能被 Hive 提供的多个安全选项之一取代。

对于受 NO_DROP CASCADE 保护的表,可以使用IGNORE PROTECTION 删除指定的分区或分区集(例如,在两个 Hadoop 集群之间拆分表时):

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec IGNORE PROTECTION;

HIVE在 1.2.1 版中将 PURGE 选项添加到 了ALTER TABLE。
如果指定了 PURGE,分区数据不会进入 .Trash/Current 目录,因此在错误的 DROP 情况下无法检索:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec PURGE;     -- (Note: Hive 1.2.0 and later)

在 Hive 0.7.0 或更高版本中,如果分区不存在,DROP 将返回错误,除非指定了 IF EXISTS 或配置变量 hive.exec.drop.ignorenonexistent 设置为 true。

分区归档
归档是一种将分区文件移动到 Hadoop Archive (HAR) 的功能。 这样做只会减少文件数; HAR 不提供任何文件压缩。
ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;
修改表或分区 更改表/分区文件格式
ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

此语句更改表(或分区)的文件格式。 该 *** 作仅更改表元数据。 任何现有数据的转换都必须在 Hive 之外完成。

更改表或分区位置
ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";
更改表或分区的压缩
在 Hive 版本 0.13.0 及更高版本中,当使用事务时,ALTER TABLE 语句可以请求压缩表或分区。 从 Hive 版本 1.3.0 和 2.1.0 开始,当使用事务时,ALTER TABLE ... COMPACT 语句可以包含一个 TBLPROPERTIES 子句,用于更改压缩 MapReduce 作业或覆盖任何其他 Hive 表属性。
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])]
  COMPACT 'compaction_type'[AND WAIT]
  [WITH OVERWRITE TBLPROPERTIES ("property"="value" [, ...])];

通常,在使用 Hive 事务时不需要请求压缩,因为系统会检测到它们的需求并启动压缩。 但是,如果关闭表的压缩,或者您想在系统不会选择的时间压缩表,则 ALTER TABLE 可以启动压缩。 默认情况下,该语句将排队请求压缩并返回。 要查看压缩的进度,请使用 SHOW COMPACTIONS。 从 Hive 2.2.0 开始,可以指定“AND WAIT”使 *** 作块直到压缩完成。compaction_type 可以是 MAJOR 或 MINOR。

更改表/分区touch
ALTER TABLE table_name TOUCH [PARTITION partition_spec];

TOUCH读取的元数据,并将其写回。这具有使前/后执行挂钩触发的效果。一个示例是:如果您有一个钩子记录所有已修改的表/分区,以及一个直接更改HDFS上文件的外部脚本。因为脚本修改了Hive之外的文件,所以这个修改不会被钩子记录下来。外部脚本可以调用Touch来触发钩子,并将所述表或分区标记为修改后的表或分区。

另外,如果我们将可靠的最后修改时间合并起来,以后可能会很有用。TOUCH也会更新那个时间。

注意,如果TOUCH的表或分区不存在,它也不会创建表或分区。

更改表/分区连接

在 Hive 0.8.0 对RCFile 添加了使用 concatenate 命令快速合并小型 RCFile 的块级支持。 在 Hive 0.14.0 中对ORC 文件添加了使用 concatenate 命令对小型 ORC 文件进行快速stripe 的支持。

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE;

如果表或分区包含很多小的 RCFiles 或 ORC 文件,那么上面的命令会将它们合并成更大的文件。 在 RCFile 的情况下,合并发生在块级别,而对于 ORC 文件,合并发生在条带级别,从而避免解压缩和解码数据的开销。

在ORC文件中保存了三个层级的统计信息,分别为文件级别、stripe级别和row group级别的,他们都可以用来根据Search ARGuments(谓词下推条件)判断是否可以跳过某些数据,在统计信息中都包含成员数和是否有null值,并且对于不同类型的数据设置一些特定的统计信息。

(1)file level
在ORC文件的末尾会记录文件级别的统计信息,会记录整个文件中columns的统计信息。这些信息主要用于查询的优化,也可以为一些简单的聚合查询比如max, min, sum输出结果。

(2)stripe
ORC文件会保存每个字段stripe级别的统计信息,ORC reader使用这些统计信息来确定对于一个查询语句来说,需要读入哪些stripe中的记录。比如说某个stripe的字段max(a)=10,min(a)=3,那么当where条件为a >10或者a <3时,那么这个stripe中的所有记录在查询语句执行时不会被读入。

(3)row level
为了进一步的避免读入不必要的数据,在逻辑上将一个column的index以一个给定的值(默认为10000,可由参数配置)分割为多个index组。以10000条记录为一个组,对数据进行统计。Hive查询引擎会将where条件中的约束传递给ORC reader,这些reader根据组级别的统计信息,过滤掉不必要的数据。如果该值设置的太小,就会保存更多的统计信息,用户需要根据自己数据的特点权衡一个合理的值。

更改表或分区的列

在Hive 3.0.0中加入该命令,让用户同步SERDE存储模式信息到metastore。

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] UPDATE COLUMNS;
具有自描述表模式的SERDES表在现实中可能有不同的模式,而存储在Hive metastore中的表也可能有不同的模式。例如,当用户使用模式url或模式文字创建Avro存储表时,模式将被插入到HMS中,然后无论服务器中的url或文字如何更改,模式都不会在HMS中被更改。这可能导致问题,特别是在与其他Apache组件集成时。

更新列功能为用户提供了让在SERDE所做的任何模式更改能同步到HMS的方式。它适用于表和分区一级,而且显然只适用于其模式未被HMS跟踪的表(见metastore.serdes.using.metastore.for.schema)。在这些后来SERDE类型使用命令将导致错误。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5576226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存