Apache Hive3定位表并更改其位置

Apache Hive3表

1、Apache Hive3表概述

Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于表的类型。您可以根据其支持的存储格式选择表的类型

您可以创建ACID(原子性、一致性、隔离性和持久性)表用于不受限制的事务或仅插入的事务。这些表是Hive托管表。数据与Schema一起位于Hive Metastore中。或者您可以创建一个外部表用于非事务性使用。数据位于Hive Metastore外部。Schema元数据位于Hive Metastore内部。因为外部表受Hive的控制很弱,所以该表不符合ACID

下图描述了Hive表的类型:

以下表格显示了可以使用Hive创建的表的类型、是否支持ACID属性、所需的存储格式以及关键的SQL操作:

表类型 ACID 文件格式 插入 更新/删除
托管表:CRUD事务 支持 ORC 支持 支持
托管表:仅插入式事务 支持 任意格式 支持 不支持
托管表:临时 不支持 任意格式 支持 不支持
外部表 不支持 任意格式 支持 不支持

虽然不能使用UPDATE或DELETE语句删除某些类型的表中的数据,但是可以对任何类型的表使用DROP PARTITION来删除数据

2、Hive3表存储格式

CRUD表中的数据必须为ORC格式。实现支持AcidInputFormat和AcidOutputFormat的存储处理程序等效于指定ORC存储

仅插入使用的表支持所有文件格式

默认情况下,托管表的存储类型为"优化行列"(ORC)。如果在表创建的过程中未指定任何存储,或者指定了ORC存储,则将接受默认的设置,获得具有插入、更新和删除(CRUD)功能的ACID表。如果指定其他任何存储类型,例如TEXT、CSV、AVRO或JSON,则将获得仅插入的ACID表,您不能更新或删除仅插入表中的列

3、Hive3事务表

事务表是驻留在Hive仓库中的ACID表。为了实现ACID合规性,Hive必须管理表,包括对表数据的访问。只有通过Hive才能访问和更改托管表中的数据。由于Hive可以完全控制托管表,因此Hive可以广泛地优化这些表

与用作联机分析处理(OLAP)系统相反,Hive旨在支持相对较低的事务率。您可以使用SHOW TRANSACTIONS命令列出未完成和中止的事务

Hive3中的事务表与非ACID表相当。Hive3事务表中不需要分桶或排序。分桶不会影响性能。这些表与原生的云存储兼容

Hive支持每个事务一个语句,该语句可以包含任意数量的行、分区或表

4、Hive3外部表

外部表数据不是由Hive拥有或控制的。当您想使用Hive以外的其他工具直接在文件级别访问数据时,通常使用外部表。您还可以使用存储处理程序(例如Druid或HBase)来创建位于Hive元存储之外的表

在外部表上,Hive3不支持以下功能:

  • 查询缓存
  • 物化视图(仅限于有限的方式)
  • 自动运行时过滤
  • 插入后的文件合并
  • ARCHIVE、UNARCHIVE、TRUNCATE、MERGE和CONCATENATE。这些语句仅适用于Hive管理表

在外部表上运行DROP TABLE时,默认情况下,Hive仅删除元数据(Schema)。如果您希望DROP TABLE命令也删除外部表中的实际数据,就像DROP TABLE在托管表上所做的那样,则需要将external.table.purge属性设置为true

5、定位Hive3表并更改位置

您需要知道Hive在HDFS上存储表的位置以及安装服务后如何更改仓库位置

您在CDP中创建的新表存储在托管表的Hive仓库或外部表的Hive仓库中。以下默认仓库位置位于HDFS文件系统中:

sql 复制代码
/warehouse/tablespace/managed/hive
/warehouse/tablespace/external/hive

托管表驻留在托管表空间中,只有Hive可以访问。默认情况下,Hive假定外部表驻留在外部表空间中

要确定托管或外部表类型,您可以运行如下命令:

sql 复制代码
DESCRIBE EXTENDED table_name;

要访问对象存储或文件系统(如HDFS)中的外部表,需要设置Ranger策略

更改Hive仓库位置的功能旨在在安装服务后立即使用。您可以使用Cloudera Manager中的Hive Metastore Action菜单更改仓库的位置,步骤如下:

1) 在Cloudera Manager中,单击集群->Hive->操作菜单->创建Hive仓库目录

2) 在Cloudera Manager中,单击Clusters->Hive(Hive Metastore服务)->Configuration,并将hive.metastore.warehouse.dir属性值更改为新Hive仓库目录的路径

3) 单击Hive->Hive->操作菜单->创建Hive仓库外部目录

4)hive.metastore.warehouse.external.dir属性值更改为Hive仓库外部目录的路径

5) 配置Ranger Hadoop SQL策略,访问对象存储(如S3、Ozone)或文件系统(如HDFS)上的目录URL

6、使用点表示法引用表

Hive3.1使用点表示法对表引用的更改可能需要对Hive脚本进行更改

CDP中的Hive3.1包括SQL兼容性 (Hive-16907),它拒绝db.tableSQL查询。表名中不允许使用.点。要在表名中引用数据库和表,请将两者括在反引号中,如下所示:

sql 复制代码
`db`.`table`

7、理解CREATE TABLE行为

Hive表的创建自Hive3以来发生了重大变化,以提高可用性和功能。如果要从CDH或HDP升级,则必须了解影响遗留表创建行为的更改

Hive通过以下方式改变了表的创建:

  • 创建ACID兼容的表,这是CDP中的默认值
  • 支持简单的写入和插入
  • 写入多个分区
  • 在单个SELECT语句中插入多个数据更新
  • 消除了对桶的需要

如果你有一个ETL管道在Hive中创建表,那么这些表将被创建为ACID。Hive现在严格控制访问,并定期对表执行压缩。使用兼容ACID的事务表不会导致性能或操作过载。从Spark和其他客户端访问托管Hive表的方式发生了变化。在CDP中,访问外部表需要设置安全访问权限

您必须了解传统平台(如CDH或HDP)中CREATE TABLE语句的行为,以及升级到CDP(Cloudera Data Platform)后这些行为的变化

  • 在升级到CDP之前

    • 在CDH5、CDH6和HDP2中,默认情况下,CREATE TABLE以纯文本格式创建一个非ACID管理的表
    • 在HDP3和CDP 7.1.0到7.1.7,默认情况下,CREATE TABLE可以创建ORC格式的完整ACID事务表,也可以为所有其他表格式创建仅插入的ACID事务表
  • 升级到CDP后

    • 如果您从HDP2、CDH5或CDH6升级到CDP 7.1.0-7.1.8,默认情况下CREATE TABLE创建ORC格式的完整ACID事务表,或者为所有其他表格式创建仅插入的ACID事务表
    • 如果您正在从HDP3或CDP 7.1.0升级到7.1.7-7.1.8,现有的行为仍然存在,CREATE TABLE创建ORC格式的完整ACID事务表,或者为所有其他表格式创建仅插入的ACID事务表

既然已经理解了CREATE TABLE语句的行为,就可以通过配置某些属性来选择修改默认的表行为。配置的优先顺序如下(修改默认的CREATE TABLE行为):

1)创建表时覆盖默认行为

无论数据库、会话或站点级别的设置如何,您都可以通过在CREATE table语句中使用MANAGED或EXTERNAL关键字来覆盖默认的表行为

sql 复制代码
CREATE [MANAGED][EXTERNAL] TABLE foo (id INT);

2)在数据库级别设置默认表类型

您可以使用数据库属性defaultTableType=EXTERNAL或ACID来指定要使用CREATE table语句创建的默认表类型。可以在创建数据库时指定该属性,也可以在稍后使用ALTER DATABASE语句指定该属性。例如:

sql 复制代码
CREATE DATABASE test_db WITH DBPROPERTIES ('defaultTableType'='EXTERNAL');

在本例中,使用CREATE TABLE语句在test_db数据库下创建的表将创建启用了清除功能的外部表(external.table.purge = 'true'

您还可以选择将数据库配置为只允许创建外部表,而不允许创建ACID表。在创建数据库时,您可以设置数据库属性EXTERNAL_TABLES_ONLY=true,以确保仅在数据库中创建外部表。例如:

sql 复制代码
CREATE DATABASE test_db WITH DBPROPERTIES ('EXTERNAL_TABLES_ONLY'='true');

3)在会话级别设置默认的表类型

通过将hive.create.as.external.legacy设置为true或false,可以在现有的直线会话中配置CREATE TABLE行为。将该值设置为true将导致CREATE TABLE语句默认创建外部表。

当会话结束时,默认的CREATE TABLE行为也会结束。

4)在站点级别设置默认表类型

通过在Hive配置下的Cloudera Manager中配置Hive . CREATE .as.insert.only和Hive . CREATE .as.acid属性,可以在站点级配置CREATE TABLE行为。在站点级别配置时,该行为在会话之间持续存在。有关更多信息,请参见配置CREATE TABLE行为。

如果您是Spark用户,那么切换到遗留行为是不必要的。例如,在SparkSQL中调用"create table",会在升级到Cloudera数据平台后创建一个外部表,就像升级之前一样。您可以使用Hive Warehouse Connector (HWC)连接Hive,从Spark读取Hive ACID表。要从Spark向Hive写入ACID表,可以使用HWC和HWC API。当你不使用HWC API时,Spark会创建一个带有purge属性的外部表。更多信息请参见Hive Warehouse Connector访问Spark数据

官方文档:https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/cdp-data-migration-table-create.html

未完待续...

参考文章:https://developer.aliyun.com/article/786518

相关推荐
core51221 小时前
Hive实战(三)
数据仓库·hive·hadoop
程序员小羊!1 天前
大数据电商流量分析项目实战:Hive 数据仓库(三)
大数据·数据仓库·hive
core5122 天前
Hive实战(一)
数据仓库·hive·hadoop·架构·实战·配置·场景
智海观潮2 天前
Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
hive·sql·spark
cxr8282 天前
基于Claude Code的 规范驱动开发(SDD)指南
人工智能·hive·驱动开发·敏捷流程·智能体
core5123 天前
Hive实战(二)
数据仓库·hive·hadoop
Agatha方艺璇4 天前
Hive基础简介
数据仓库·hive·hadoop
像豆芽一样优秀5 天前
Hive和Flink数据倾斜问题
大数据·数据仓库·hive·hadoop·flink
howard20056 天前
VMWare上搭建Hive集群
hive·hadoop
未来之窗软件服务7 天前
Chrome CDP企业自动运营(一) 获取iframe页面内容——东方仙盟
chrome·cdp·仙盟创梦ide·东方仙盟