hive union所有效率和最佳实践

mwg9r5ms  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(634)

我有个Hive效率的问题。我有两个大量的查询需要过滤,与Map表连接,并联合。两个表的所有联接都是相同的。在将连接应用于组合表之前将它们合并,或者单独将连接应用于每个大规模查询然后合并结果,这样会更有效吗?有区别吗?
我尝试了第二种方法,查询运行了24小时才终止。我觉得我尽了我所能来优化它,除了可能重新安排联合声明。一方面,我觉得这应该无关紧要,因为Map表所连接的行数或行数是相同的,而且由于所有内容都是令人满意的,所以所花费的时间应该大致相同。另一方面,也许通过首先进行联合,它应该保证在运行连接之前,两个大的查询都得到了完整的系统资源。再说一次,这可能意味着一次只有两个作业在运行,所以系统没有得到充分利用。
我对hive和它的多线程工作原理的了解还不够。有人有什么想法吗?

isr3a4wc

isr3a4wc1#

没有这样的最佳实践。两种方法都适用。union中的子查询都作为并行作业运行。因此,联合前的连接将作为具有较小数据集的并行任务工作,tez可以优化执行,并且公共连接表将在单个Map器阶段对每个表只读取一次。此外,您还可以避免某些子查询的联接,例如,如果它们的键不适用于联接。
与union-ed-bigger-dataset连接也可以使用非常高的并行性,这取决于您的设置(例如,每个减速机的字节数),优化器还可以重写查询计划。所以我建议你检查这两种方法,测量速度,研究计划,检查你是否可以改变一些东西。改变,测量,学习计划。。。重复
还有一些建议:在加入数据集之前尽量限制它们。如果您的连接将行相乘,那么分析和聚合在更大的数据集上的工作可能会更慢,如果您可以在连接之前应用分析/聚合,那么第一种方法可能更可取。

相关问题