我有一个关于蜂巢效率的问题。我有两个大规模的查询,需要过滤,与映射表连接,并联合。两个表的所有联接都是相同的。在将连接应用于组合表之前联合它们是更有效,还是将连接单独应用于每个海量查询而不是联合结果?有什么不同吗?
我尝试了第二种方法,查询运行了24小时,然后我终止了它。我觉得我已经做了我能做的所有事情来优化它,除了可能会重新排列union语句。一方面,我觉得这无关紧要,因为映射表连接的行数或行数是相同的,而且由于所有内容都是官样化的,所以它应该花费大致相同的时间。另一方面,也许通过首先进行联合,它应该保证在运行连接之前为两个大查询提供完整的系统资源。再说一次,这可能意味着一次只有2个作业在运行,所以系统没有得到充分利用。
我对hive和它的多线程是如何工作的知之甚少。有谁有什么想法吗?
发布于 2017-06-06 15:29:57
没有这样的最佳实践。这两种方法都适用。UNION ALL中的子查询作为并行作业运行。因此,联合之前的连接将作为具有较小数据集的并行任务工作,tez可以优化执行,并且每个表的公共连接表将在单个映射器阶段仅读取一次。此外,您还可以避免某些子查询的联接,例如,如果它们的键不适用于联接。
根据您的设置(例如,每个reducer的字节数),使用联合的较大数据集连接也可能具有非常高的并行度,优化器也可能重写查询计划。所以我建议你检查两种方法,测量速度,学习计划,检查你是否可以改变一些东西。改变,衡量,学习计划..。重复
更多的建议:在加入数据集之前,尝试限制它们。如果您的连接乘以行,那么分析和聚合在更大的数据集上的工作速度可能会更慢,如果您可以在联合之前应用分析/聚合,则第一种方法可能更可取。
https://stackoverflow.com/questions/44392599
复制相似问题