暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

大数据杂货铺 2020-11-24
388

由于在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中的时间戳:

    > SELECT CAST(1597217764557 AS TIMESTAMP);
    | 2020-08-12 00:36:04 |

    升级到CDP之后

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

      > 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字符串解释为表名。

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

        math.students

        出现在CREATE TABLE语句中。

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

          CREATE TABLE `math`.`students` (name VARCHAR(64), age INT, gpa DECIMAL(3,2));



          处理关键字APPLICATION


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

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

          升级到CDP之前

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

            > select f1, f2 from application

            升级到CDP之后

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

            需要采取的行动

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

              SELECT field1, field2 FROM `application`;



              禁用分区类型检查


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

              升级到CDP之前

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

              升级到CDP之后

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

              需要采取的行动

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

                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函数。

                  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




                  文章转载自大数据杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论