1. 当对3个或更多的表进行join连接时,若是on子句都是使用相同的连接键的话,那么只会产生一个mapreduce任务。

2. 用户在进行多表查询时,需要保证连续查询的表的大小从左至右是依次增大的。因为Hive假定查询中最后一个表是最大的表,在对每行记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后那个大表进行计算。

3. map-side join:使用Broadcast实现map侧join的方式可通过如下设置,将Broadcast的阈值设置得足够大,再通过sql进行join

SET spark.sql.autoBroadcastJoinThreshold=104857600;
INSERT OVERWRITE TABLE test_join
SELECT test_new.id, test_new.name
FROM test
JOIN test_new
ON test.id = test_new.id

4. on条件语句中的分区过滤条件在外连接outer join中是无用的,不过在内连接inner join 中是有效的。

5. 左半开连接left semi join会返回满足on条件的左边表的记录,相比于内连接inner join,是一种特殊优化的join语句,等价于in & exist语法结构。semi join比inner join更高效,对于左表中的一条指定记录,一旦在右表中找到满足on条件的记录就会停止扫描右表。即对于左表的一条指定记录,只会保留一条右表匹配记录,而inner join则是返回了多条匹配记录。  
注意select和where语句中不能出现右表中的字段。 另外,Hive不支持右半开连接。

6. 笛卡尔积join,即不加on条件的join,其结果集的大小等于左表行数乘右表行数的大小。执行时间长且运行缓慢。

7. order by,sort by,distribute by,cluster by区别

  • order by
    (1):order by后面可以有多列进行排序,默认按字典排序。
    (2):order by为全局排序。
    (3):order by需要reduce操作,且只有一个reduce,无法配置(因为多个reduce无法完成全局排序)。
    注:如果在strict模式下使用order by语句,那么必须要在语句中加上limit关键字,因为执行order by的时候只能启动单个reduce,如果排序的结果集过大,那么执行时间会非常漫长。
  • sort by
    sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只会保证每个reducer的输出有序,并不保证全局有序。sort by不同于order by,它不受hive.mapred.mode属性的影响,sort by的数据只能保证在同一个reduce中的数据可以按指定字段排序。使用sort by你可以指定执行的reduce个数(通过set mapred.reduce.tasks=n来指定),对输出的数据再执行归并排序,即可得到全部结果。
  • distribute by
    distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。distribute by经常和sort by配合使用。
  • cluster by
    cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒叙排序,不能指定排序规则为ASC或者DESC。