Hints 英译为“暗示,示意,提示”,用于数据表join时影响执行语句被后台程序解析成执行计划的,达到优化执行效率的目的。说白了这有点像写Java代码里面的注解(anotation)。
主要有两个hints:
Hints | 解释 | 使用场景 |
[SHUFFLE] | 把join操作使用分区技术(”partitioned” technique 之所以叫分区技术,因为这种join很类似分区的表(注:原文刚好的反意思,我猜是编辑写错了)),取出匹配的数据,把子数据集分发到其他的节点运算。 | 用于不可预测数据量的两个大表join |
[BROADCAST] | join操作使用“广播”技术(”broadcast” technique),把jion的右边的小表内容全部发送到各个节点。 | 当有一个大表和一个小表。小表放右边,这一点和hive刚好相反 |
三种使用案例:
1、用一个查找表的数据(如100行数据)去匹配一个包含很多数据的用户记录表。Join右边的表被发送到所有计算节点。
select customer.address, state_lookup.state_namefrom customer join [broadcast] state_lookupon (customer.state_id = state_lookup.state_id);
2、Join两个大的数据表,我们使用[shuffle]来暗示程序使用“分区”方式执行
select weather.wind_velocity, geospatial.altitudefrom weather join [shuffle] geospatialon (weather.lat = geospatial.lat and weather.long = geospatial.long);
3、当有三个表,其中两个大表(t1,t2),一个小表(t3)的时候该怎么做呢?这时候我们对两大表使用[shuffle],之后的结果集对第三个小表使用[broadcast]。
select t1.name, t2.id, t3.pricefrom t1 join [shuffle] t2 join [broadcast] t3on (t1.id = t2.id and t2.id = t3.id);
impala获取元数据信息是会过期的,若使用过期的元数据进行查询的话得到的结果就不准确了。那么什么情况下会发现元数据过期呢?如何避免呢?下面我们详细看看。
元数据需要更新的情况,即过期的情况:
1、装载文件或者ETL时插入数据
2、来自与集群里其他的impalad实例或hive改变元数据
3、来自客户端的impala shell或者ODBC直接连接的修改元数据
不需要更新元数据的情况:来自与同一个impala节点的ALTER TABLE,INSERT,或者其他修改表的语句。
修改元数据的操作大概有:
1、Hive : ALTER ,CREATE,DROP,INSERT
2、Impalad:CREATE TABLE,ALTER TABLE,INSERT操作
解决方法:
1、INVALIDATE METADATA [table_name]
2、REFRESH table_name
INVALIDATE METADATA:让元数据过期腐败不可用,当表重新引用的时候重新加载。缺点:该语句是重量级的,比较耗时。该特性来自与Impala的1.1版本
REFRESH:刷新表的元数据,必须跟上表名这个参数(确定)。实时的,轻量级的(优点)
因此当需要更新大量元数据时使用INVALIDATE METADATA(不加表名) 。否则优先使用REFRESH。
也可以当启动impala-shell的时候使用-r(–refresh_after_connect)参数,等连接到impala server时更新元数据。
联系客服