大数据学习(109)-Impala 和 Hive 之间的 SQL 差异

🍋🍋大数据学习🍋🍋

🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


Impala 的 SQL 语法遵循 SQL-92 标准,并在内置函数等领域包含许多行业扩展。有关将 SQL 代码从各种数据库系统调整到 Impala 的一般讨论,请参阅将 SQL 从其他数据库系统移植到 Impala

由于 Impala 和 Hive 共享同一个元存储数据库,并且它们的表经常互换使用,因此以下部分详细介绍了 Impala 和 Hive 之间的差异。

一、HiveQL 功能在 Impala 中不可用

Impala 的当前版本不支持您可能熟悉的 HiveQL 中的以下 SQL 功能:

  • 扩展性机制,例如 TRANSFORM 、自定义文件格式或自定义 SerDes。
  • DATE 数据类型。
  • BINARY 数据类型。
  • XML 函数。
  • HiveQL 中的某些聚合函数: covar_pop , , covar_samp , corr percentile percentile_approx histogram_numeric collect_set ;Impala 支持 Impala 聚合函数中列出的聚合函数集和 Impala 分析函数中列出的分析函数。
  • 采样。
  • 侧视图。在 CDH 5.5 / Impala 2.3 及更高版本中,Impala 支持使用联接表示法而不是 EXPLODE() 关键字对复杂类型( STRUCT 、 ARRAY 或 MAP )进行查询。看 复杂类型(仅限 CDH 5.5 或更高版本), 了解有关 Impala 对复杂类型支持的详细信息。
从 Impala 1.2 开始支持用户定义的函数 (UDF)。有关 Impala UDF 的完整详细信息,请参阅 用户定义的函数 (UDF)。
  • Impala 支持用 C++ 编写的高性能 UDF,以及重用一些基于 Java 的 Hive UDF。

  • Impala 支持标量 UDF 和用户定义的聚合函数 (UDAF)。Impala 目前不支持用户定义的表生成函数 (UDTF)。

  • 基于 Java 的 UDF 仅支持 Impala 支持的列类型。

  • 不能通过 Impala 从 Java UDF 调用 Hive current_user() 函数。

Impala 目前不支持以下 HiveQL 语句:

  • ANALYZE TABLE (Impala 等价物是 COMPUTE STATS )
  • DESCRIBE COLUMN
  • DESCRIBE DATABASE
  • EXPORT TABLE
  • IMPORT TABLE
  • SHOW TABLE EXTENDED
  • SHOW TBLPROPERTIES
  • SHOW INDEXES
  • SHOW COLUMNS
  • INSERT OVERWRITE DIRECTORY ;use INSERT OVERWRITE table_name 或 CREATE TABLE AS SELECT 将查询结果具体化到与 Impala 表关联的 HDFS 目录中。

Impala 仅遵循 TEXT 表的 serialization.null.format table 属性,而忽略 Parquet 和其他格式的属性。Hive 遵循 serialization.null.format 属性,并在扫描期间将匹配值转换为 NULL。请参阅 Text Tables 的数据文件 以在 Impala 中使用 table 属性。

二、Impala 和 HiveQL 功能之间的语义差异

本节介绍的实例 Impala 和 Hive 具有相似的功能,有时包含相同的语法,但这些功能的运行时语义存在差异。

安全:

Impala 利用 Apache Sentry 授权框架,该框架提供基于角色的精细访问控制,以保护数据免受未经授权的访问或篡改。

CDH 5.1 及更高版本中包含的 Hive 组件现在包括支持 GRANT Sentry 的 、 REVOKE 和 CREATE/DROP ROLE 语句。早期的 Hive 版本具有一个特权系统,其中包含 GRANT 主要用于防止意外删除数据的 and REVOKE 语句,而不是防止恶意用户的安全机制。

Impala 可以使用通过 Hive GRANT 和 REVOKE 语句设置的权限。Impala 在 Impala 2.0 及更高版本中有自己的 GRANT and REVOKE 语句。有关 Impala 中授权的详细信息,包括如何使用存储在元存储数据库中的权限从原始基于策略文件的权限模型切换到 Sentry 服务,请参阅为 Impala 启用 Sentry 授权 

SQL 语句和子句:

Impala SQL 语句的语义与 HiveQL 不同,在某些情况下,它们使用类似的 SQL 语句和子句名称:

  • Impala 对查询提示使用不同的语法和名称, [SHUFFLE] 而不是 [NOSHUFFLE] MapJoin or StreamJoin 。有关 Impala 的详细信息,请参阅 Joins in Impala SELECT Statements
  • Impala 不会公开 SORT BY 、 或 DISTRIBUTE BY 的 MapReduce 特定功能 CLUSTER BY 。
  • Impala 不要求查询包含 FROM 子句。

数据类型:

  • Impala 支持一组有限的隐式强制转换。这有助于避免意外的强制转换行为导致意外的结果。
    • Impala 不会在字符串和数字或布尔类型之间隐式转换。始终用于 CAST() 这些转换。
    • Impala 在从较小或不太精确的类型转换为更大或更精确的类型时,会在数字类型之间执行隐式转换。例如, Impala 会将 a SMALLINT 隐式转换为 a BIGINT 或 FLOAT ,但要将 a DOUBLE 转换为 或 FLOAT INT to TINYINT ,需要在查询中调用 to CAST() 。
    • Impala 确实执行了从 string 到 timestamp 的隐式转换。Impala 的 TIMESTAMP 数据类型有一组受限的文本格式,而 from_unixtime() format string;有关详细信息,请参阅 TIMESTAMP 数据类型 

    请参阅数据类型下的主题,了解有关每种数据类型的隐式和显式强制转换的完整详细信息,以及 Impala 类型转换函数 ,了解有关该 CAST() 函数的详细信息。

  • Impala 不会使用本地时区存储或解释时间戳,以避免意外的时区问题带来意外结果。时间戳是相对于 UTC 存储和解释的。对于 Impala 和 Hive 之间对名称相似的日期/时间函数的某些调用,这种差异可能会产生不同的结果。有关 Impala 函数的详细信息,请参阅 Impala 日期和时间函数 。有关 Impala 如何处理时区的讨论,以及在处理 Parquet 编码时可用于使 Impala 更紧密地匹配 Hive 行为的配置选项,请参阅 TIMESTAMP 数据类型 TIMESTAMP 数据,或者在本地时区和 UTC 之间进行转换时。
  • Impala TIMESTAMP 类型可以表示从 1400-01-01 到 9999-12-31 的日期。这与 Hive 日期范围不同,后者是 0000-01-01 到 9999-12-31。
  • Impala 不会将列溢出作为 NULL 返回,以便客户可以区分 NULL 数据和溢出情况,就像使用传统数据库系统一样。Impala 返回类型范围内的最大值或最小值。例如, tinyint 范围从 -128 到 127 的有效值。在 Impala 中,值为 -200 的 a tinyint 返回 -128 而不是 NULL 。一个 tinyint 值为 200 时,将返回 127。

其他功能:

  • Impala 不提供虚拟列。
  • Impala 不会公开锁定。
  • Impala 不会公开某些配置属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值