文章目录
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
- 刷新所有表的元数据。
刷新所有表执行如下语句:
这种方式适用于创建了新表、删除了表、执行了HDFS Rebalance操作和删除了数据文件等情况。INVALIDATE METADATA
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:
select 20000 = '20000';
而Impala不支持不同数据类型之间的比较。