升级Hive3处理语义和语法变更

2020-12-08 11:08:10 浏览数 (1)

由于在CDH或HDP中运行的Hive的早期版本与CDP中的Hive 3之间的语义变化,您需要执行许多与迁移相关的更改。Hive 3中与db.table引用和DROP CASCADE相关的一些语法更改可能需要对应用程序进行更改。

转换时间戳

将数字转换为时间戳的应用程序的结果从Hive 2到Hive 3有所不同。ApacheHive更改了CAST的行为以符合SQL标准,该标准不将时区与TIMESTAMP类型相关联。

升级到CDP之前

将数字类型值强制转换为时间戳可用于生成反映集群时区的结果。例如,1597217764557是2020-08-12 PDT。运行以下查询将数字转换为PDT中的时间戳:

代码语言:javascript复制
> SELECT CAST(1597217764557 AS TIMESTAMP);
| 2020-08-12 00:36:04 |

升级到CDP之后

将数字类型值转换为时间戳会产生反映UTC而不是集群时区的结果。运行以下查询将数字强制转换为UTC中的时间戳。

代码语言:javascript复制
> SELECT CAST(1597217764557 AS TIMESTAMP);
| 2020-08-12 07:36:04.557  |

需要采取的行动

更改应用程序。不要通过数字强制转换来获取本地时区。内置函数from_utc_timestamp和to_utc_timestamp可用于模拟升级前的行为。

检查字段变更的兼容性

默认配置更改可能导致更改列类型的应用程序失败。

升级到CDP之前

在HDP 2.x中hive.metastore.disallow.incompatible.col.type.changes默认值是false,阻止Hive不兼容的字段类型的变更。例如,您可以将STRING列更改为不兼容类型的列,例如MAP <STRING,STRING>。没有错误发生。

升级到CDP之后

在CDP中,hive.metastore.disallow.incompatible.col.type.changes默认值为true。配置单元可防止更改不兼容的列类型。不会阻止兼容的列类型更改,例如INT,STRING,BIGINT。

需要采取的行动

更改应用程序以禁止不兼容的字段类型更改,以防止可能的数据损坏。检查ALTER TABLE语句,并更改由于不兼容的列类型而失败的语句。

创建表

为了提高可用性和功能,Hive 3在建表上做了重大变更。

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

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

如果您具有在Hive中创建表的ETL管道,则这些表将被创建为ACID。Hive现在严格控制访问并定期在表上执行压缩。从Spark和其他客户端访问托管Hive表的方式发生了变化。在CDP中,对外部表的访问要求您设置安全访问权限。

升级到CDP之前

在CDH和HDP 2.6.5中,默认情况下CREATE TABLE创建了一个非ACID表。

升级到CDP之后

在CDP中,默认情况下,CREATE TABLE以ORC格式创建完整的ACID事务表。

需要采取的行动

执行以下一项或多项操作:

  • 升级过程会将CDH中的Hive托管表转换为外部表。您必须更改脚本以创建用例所需的表类型。
  • 配置旧的CREATE TABLE行为以默认创建外部表。
  • 要从Spark读取Hive ACID表,请使用Hive Warehouse Connector(HWC)或HWC Spark Direct Reader连接到Hive。要从Spark写入Hive ACID表,请使用HWC和HWC API。当您不使用HWC API时,Spark将使用purge属性创建一个外部表。
  • 为表设置Ranger策略和HDFS ACL。

更正查询中的`db.table`

为了符合ANSI SQL,Hive 3.x拒绝SQL查询中的`db.table` 。表名中不允许使用点(.)。

您需要更改使用此类`db.table` 引用的查询,以防止Hive将整个db.table字符串解释为表名。您将数据库名称和表名称括在反引号中。

向表引用添加反引号

CDP包含Hive-16907错误修复程序,该错误修复程序拒绝SQL查询中的`db.table` 。表名中不允许使用点(.)。您需要更改使用此类引用的查询,以防止Hive将整个db.table字符串解释为表名。

查找具有问题表引用的表。

代码语言:javascript复制
math.students

出现在CREATE TABLE语句中。

将数据库名称和表名称括在反引号中。

代码语言:javascript复制
CREATE TABLE `math`.`students` (name VARCHAR(64), age INT, gpa DECIMAL(3,2));

处理关键字APPLICATION

如果在查询中使用关键字APPLICATION,则可能需要修改查询以防止失败。

为防止使用关键字的查询失败,请将查询括在反引号中。

升级到CDP之前

在CDH版本(例如CDH 5.13)中,在查询中使用单词APPLICATION的查询将成功执行。例如,您可以将此词用作表名。

代码语言:javascript复制
> select f1, f2 from application

升级到CDP之后

使用关键字APPLICATION的查询失败。

需要采取的行动

更改应用程序。将查询括在反引号中。

代码语言:javascript复制
SELECT field1, field2 FROM `application`;

禁用分区类型检查

Hive 3中的一项增强功能可以检查分区的类型。可以通过设置属性来禁用此功能。

升级到CDP之前

在CDH 5.x中,不对分区值进行类型检查。

升级到CDP之后

如果属性hive.typecheck.on.insert设置为true(默认值),则对分区规范中指定的分区值进行类型检查,转换和规范化以符合其列类型 。值可以是数字。

需要采取的行动

如果分区的类型检查导致问题,请禁用该功能。要禁用分区类型检查,请设置hive.typecheck.on.insert为false。例如:

代码语言:javascript复制
SET hive.typecheck.on.insert=false;

删除分区

CASCADE子句中用于删除分区的OFFLINE和NO_DROP关键字会导致性能问题,不再受支持。

升级到CDP之前

您可以在DROP CASCADE子句中使用OFFLINE和NO_DROP关键字来防止读取或删除分区。

升级到CDP之后

DROP CASCADE子句不支持OFFLINE和NO_DROP。

需要采取的行动

更改应用程序以从DROP CASCADE子句中删除OFFLINE和NO_DROP。使用授权方案,例如Ranger,以防止删除或读取分区。

向角色授予权限

在CDH中的ROLE / GROUP语义与CDP中的那些语义不同。Hive 3需要严格控制的文件系统和计算机内存资源,以替代早期Hive版本允许的灵活边界。

明确的边界增加了可预测性。更好的文件系统控制可提高安全性。该模型提供比其他安全方案更强的安全性和更好的策略管理。

升级到CDP之前

在CDH中,建议将Sentry用于CDH政策管理。CDH支持GRANT ON ROLE语义。

升级到CDP之后

Hive 3中的主要授权模型是Ranger,而不是Sentry。如果要从CDH迁移,请从Sentry移至Apache Ranger。不支持GRANT ON ROLE语义。

需要采取的行动

例如,使用CDP支持的GRANT语义来设置文件系统权限:

GRANT <permissions> ON TABLE <table> TO USER <user or group>;

使用配置基于资源的策略:配置单元中描述的语义。

处理最大和最小函数的输出

升级到CDP之前

最大的函数返回值列表中的最大值。最小函数返回值列表中的最小值。

升级到CDP之后

当一个或多个参数为NULL时返回NULL。

需要采取的行动

在用作最大或最小函数的参数的列上使用NULL过滤器或nvl函数。

代码语言:javascript复制
SELECT greatest(nvl(col1,default value incase of NULL),nvl(col2,default value incase of NULL));

重命名表

为了强化系统,可以将Hive数据存储在HDFS加密区域中。RENAME已更改来防止将表移到相同的加密区域之外或移入非加密区域。

升级到CDP之前

在CDH和HDP中,重命名托管表将移动其HDFS位置。

升级到CDP之后

重命名托管表仅在创建不带LOCATION子句且位于其数据库目录下的表时才移动其位置。

需要采取的行动

没有。

原文链接:https://docs.cloudera.com/cdp-private-cloud/latest/upgrade/topics/cdp_data_migration_hive_semantics.html

0 人点赞