企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 注意 1. **order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间** 2. **sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置`mapred.reduce.tasks>1`,则sort by只保证每个reducer的输出有序,不保证全局有序** 3. distribute by(字段) (分发)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。 4. Cluster by(字段) (桶) 除了具有Distribute by的功能外,还会对该字段进行排序,cluster 和 sort 不能共存 因此,如果分桶和sort字段是同一个时,此时,`cluster by = distribute by + sort by` 分桶表的作用:最大的作用是用来提高join操作的效率; (思考这个问题: `select a.id,a.name,b.addr from a join b on a.id = b.id;` 如果a表和b表已经是分桶表,而且分桶的字段是id字段 做这个join操作时,还需要全表做笛卡尔积吗?) 5. **对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行**.换句话说,就是用户不允许扫描所有分区.进行这个限制的原因是,通常分区表都拥有非常大的数据集,没有分区限制会消耗巨大资源 6. **对于使用了order by的语句,要求必须使用limit.**因为order by为了执行排序会把所有结果发到一个reducer中进行处理,强制加limit来避免reducer执行过长 7. **限制笛卡尔积的查询.** # 严格模式 **注意:在hive中提供了一种“严格模式”的设置来阻止用户执行可能会带来未知不好影响的查询** 设置属性hive.mapred.mode 为strict能够阻止以下三种类型的查询: 1. 除非在where语段中包含了分区过滤,否则不能查询分区了的表。这是因为分区表通常保存的数据量都比较大,没有限定分区查询会扫描所有分区,耗费很多资源。 不允许:`select * from logs;` 允许:`select * from logs where day=20151212;` 2. 包含order by,但没有limit子句的查询。因为order by 会将所有的结果发送给单个reducer来执行排序,这样的排序很耗时 3. 笛卡尔乘积;简单理解就是JOIN没带ON,而是带where的