天天看点

Impala——Impala原理知识以及与Hive的区别(持续更新中...)Impala Metadata and the MetastoreImpala RefreshImpala与Hive在语法上的区别

文章目录

  • Impala Metadata and the Metastore
  • Impala Refresh
    • 1. 为什么要执行refresh语句
    • 2. 如何执行refresh语句
  • Impala与Hive在语法上的区别
    • 1. Impala不支持Date类型
    • 2. union字段类型
    • 3. 中文占用的长度
    • 4. 不兼容的函数
    • 5. 数字的Int类型和String类型

Impala Metadata and the Metastore

Impala和Hive在底层是共用相同的元数据库的,比如MySQL或者PostgreSQL,所以,Impala才能被Hive定义加载的表,不过前提是表中的列要使用Impala支持的数据类型、文件格式和压缩编码。

对于那些大数据量多分区的表,要获取这些表的所有元数据可能是比较耗时的。因此,Impala为了后期重用同一张表的元数据,会提前将所有的元数据缓存到每一个Impala节点,以提升查询效率。但也因此带了一些不便,看下面refresh内容。

Impala Refresh

1. 为什么要执行refresh语句

从上面我们可以知道,Impala会缓存表的元数据,但是一旦表定义或者表数据发生了更新的话,再去查询表之前就要先更新元数据。Impala1.2及之后的版本,对于在Impala中执行的DDL和DML语句,catalogd 进程是会自动更新元数据,但是在Hive中执行的DDL和DML语句或者是手动变更HDFS文件的情况,还是要使用REFRESH语句或者INVALIDATE METADATA语句,才能使新的变更生效。

2. 如何执行refresh语句

  • 刷新指定表的元数据。

    刷新指定表执行如下语句:

    REFRESH table_name
               
    这种方式适用于有新数据添加到已存在表的情况。
  • 刷新所有表的元数据。

    刷新所有表执行如下语句:

    INVALIDATE METADATA
               
    这种方式适用于创建了新表、删除了表、执行了HDFS Rebalance操作和删除了数据文件等情况。

Impala与Hive在语法上的区别

1. Impala不支持Date类型

Impala是不支持Date数据类型的。

Hive支持Date数据类型。

2. union字段类型

Impala中两表union时,对应字段的数据类型必须一致(比如,int类型不能和空字符串""union。

而Hive中是允许的。

3. 中文占用的长度

Impala中一个中文占3位,

Hive中一个中文占1位。

4. 不兼容的函数

Hive中支持而Impala不支持的函数:

  • date_format()
  • current_date()

5. 数字的Int类型和String类型

在Hive中,比较同一个数字的int类型和String类型,结果是相等的。如下SQL结果返回true:

而Impala不支持不同数据类型之间的比较。