百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Impala 和 Hive 之间的 SQL 差异?

wxin55 2024-10-25 18:03 10 浏览 0 评论

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

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

Impala 中不提供 HiveQL 功能

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

  • 可扩展性机制,例如TRANSFORM自定义文件格式或自定义 SerDes。
  • 数据DATE类型。
  • XML 函数。
  • HiveQL 中的某些聚合函数:covar_pop, covar_samp, corr, percentile, percentile_approx, histogram_numeric, collect_set; Impala 支持Impala聚合函数 中列出的聚合函数集和Impala 分析函数中列出的分析函数。
  • 采样。
  • 横向视图。在Impala 2.3及更高版本中,Impala 支持使用连接表示法而不是关键字对复杂类型( STRUCTARRAY或)进行查询。有关 Impala 对复杂类型支持的详细信息, 请参阅复杂类型(仅限 Impala 2.3 或更高版本) 。MAPEXPLODE()

从 Impala 1.2 开始支持用户定义函数 (UDF)。 有关 Impala UDF 的完整详细信息, 请参阅用户定义函数 (UDF) 。

  • Impala 支持用 C++ 编写的高性能 UDF,以及重用一些基于 Java 的 Hive UDF。
  • Impala 支持标量 UDF 和用户定义的聚合函数 (UDAF)。Impala 目前不支持用户定义的表生成函数 (UDTF)。
  • 基于 Java 的 UDF 仅支持 Impala 支持的列类型。
  • current_user()无法通过 Impala 从 Java UDF 调用 Hive函数。

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; 使用 或将查询结果具体化到与 Impala 表关联的 HDFS 目录中。 INSERT OVERWRITE table_nameCREATE TABLE AS SELECT

Impala 仅尊重serialization.null.formatTEXT 表的表属性,并忽略 Parquet 和其他格式的属性。Hive 尊重serialization.null.format Parquet 和其他格式的属性,并在扫描期间将匹配值转换为 NULL。有关在 Impala 中使用表属性的信息, 请参阅将文本数据文件与 Impala 表一起使用。

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

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

安全:

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

Hive 组件现在包括启用 Ranger 的GRANTREVOKECREATE/DROP ROLE语句。早期的 Hive 版本有一个特权系统GRANTREVOKE语句,主要目的是防止意外删除数据,而不是防止恶意用户的安全机制。

Impala 可以利用通过 HiveGRANTREVOKE语句设置的权限。Impala 在 Impala 2.0 及更高版本中有自己的GRANT声明REVOKE。有关 Impala 中授权的详细信息, 请参阅Impala 授权。

SQL 语句和子句:

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

  • Impala 对查询提示使用不同的语法和名称,[SHUFFLE][NOSHUFFLE]不是MapJoinor StreamJoin。有关 Impala 详细信息, 请参阅 Impala SELECT 语句中的连接。
  • Impala 不公开SORT BYDISTRIBUTE BY或的 MapReduce 特定功能CLUSTER BY
  • Impala 不要求查询包含FROM子句。

数据类型:

  • Impala 支持一组有限的隐式转换。这有助于避免意外的转换行为产生不良结果。
    • Impala 不会在字符串和数字或布尔类型之间隐式转换。始终用于CAST()这些转换。
    • 当从较小或不太精确的类型转换为较大或更精确的类型时,Impala 确实会在数字类型之间执行隐式转换。例如,Impala 会隐式将 a 转换 SMALLINT为 a BIGINTor FLOAT,但从 to 转换 DOUBLEFLOATor INTto需要在查询中TINYINT调用。CAST()
    • Impala 确实执行从字符串到时间戳的隐式转换。TIMESTAMPImpala 对数据类型和 格式字符串有一组有限的文字格式 from_unixtime();有关详细信息,请参阅TIMESTAMP 数据类型。
  • 有关每种数据类型的隐式和显式转换的完整详细信息,请参阅数据类型下的主题,有关函数的详细信息,请参阅 Impala 类型转换函数CAST()
  • Impala 不会使用本地时区存储或解释时间戳,以避免意外时区问题导致出现不良结果。时间戳是相对于 UTC 存储和解释的。对于 Impala 和 Hive 之间类似命名的日期/时间函数的某些调用,这种差异可能会产生不同的结果。有关 Impala 函数的详细信息,请参阅Impala 日期和时间函数。请参阅TIMESTAMP 数据类型TIMESTAMP,了解 Impala 如何处理时区的讨论,以及在处理 Parquet 编码数据或在本地时区和 UTC 之间进行转换时, 可用于使 Impala 更紧密地匹配 Hive 行为的配置选项。
  • ImpalaTIMESTAMP类型可以表示从 1400-01-01 到 9999-12-31 的日期范围。这与 Hive 日期范围不同,Hive 日期范围为 0000-01-01 到 9999-12-31。
  • Impala 不会将列溢出返回为NULL,以便客户可以区分NULL数据和溢出条件,就像在传统数据库系统中所做的那样。Impala 返回该类型范围内的最大值或最小值。例如,有效值 tinyint范围为 -128 到 127。在 Impala 中,tinyint 值为 -200 的 a 返回 -128 而不是NULLtinyint值为 200 的 A 返回 127。

其他功能:

  • Impala 不提供虚拟列。
  • Impala 不公开锁定。
  • Impala 不公开某些配置属性。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: