由于在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