当前位置: 首页 > news >正文

【踩坑】hive脚本笛卡尔积严重降低查询效率问题

前一阵子查看我们公司的大数据平台的离线脚本运行情况, 结果发现有一个任务居然跑了一天多, 要知道这还只是几千万量级的表, 且这个任务是每天需要执行的

于是我把hive脚本捞出来看了下, 发现无非多join了几个复杂的子查询, 应该不至于这么久, 包括我又检查了是不是没有加上每日分区的筛选条件

在反反复复测试调整以后, 我发现问题出在这里:

隐式join的时候顺序问题会导致错误的笛卡尔积(不确定什么版本hive)
假如t1和t2关联,t2和t3关联, 但是如果写成了from t1,t3,t2比如下面这样, 就会造成t1和t3直接笛卡尔积, 再和t2笛卡尔积, 再where筛选

-- 
select x
from t1,t3,t2
where t1.id = t2.t1_id 
and t2.id = t3.t2_id

比如t1,t2,t3表都是1000, 彼此关联的是10条, 则按常理应该是t1和t2筛选和关联后得到临时表10条, 然后这10条再和t3进行10*1000筛选和关联.

但是根据explain解释执行, 貌似hive会将上面的直接1000* 1000*1000 可想而知这个效率会是怎么样
在这里插入图片描述

最后改为正确的顺序, 从1天多变成了二几分钟.搞定
在这里插入图片描述

结论

  1. hive这个不知道是不是bug, 也可能后续会修复, 但是保险起见最好按表的关联顺序来写
  2. 建议用显式join查询
  3. 写完hive脚本测试跑一次看看效率,不确定就explain
http://www.lryc.cn/news/189381.html

相关文章:

  • 【C进阶】内存函数
  • h2database BTree 设计实现与查询优化思考
  • Linux命令(100)之sz
  • Insight h2database SQL like 查询
  • wpf中listview内容居中显示
  • 第二章 C++的输出
  • Qt中常用容器组控件介绍和实操
  • kafka、rabbitmq 、rocketmq的区别
  • java的amazonaws接口出现无法执行http请求:管道中断
  • cmake 多线程编译 指定 Visual Studio 编译器 命令行
  • 将 mysql 数据迁移到 clickhouse (最新版)
  • LeetCode 69.x的平方
  • 【小白入门】ASP.NET Core 创建 Web API
  • 如何使用摩尔信使MThings连接网络设备
  • 2023自动驾驶 车道线检测数据集
  • 排序算法-冒泡排序法(BubbleSort)
  • 3d tiles规范boundingVolume属性学习
  • 【开题报告】如何借助chatgpt完成毕业论文开题报告
  • 微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件
  • Ceph入门到精通-Nginx超时参数分析设置
  • TCP/IP(十)TCP的连接管理(七)CLOSE_WAIT和TCP保活机制
  • LeetCode 面试题 08.10. 颜色填充
  • 内排序算法
  • options.html 页面设计成聊天框,左侧是功能列表,右侧是根据左侧的功能切换成不同的内容。--chatGpt
  • 排序算法-选择排序法(SelectionSort)
  • Java-集合框架
  • 联想携中国移动打造车路协同方案 助力重庆实现32类车联网场景
  • Rust入门基础
  • 民族民俗景区3d智慧旅游系统提升游客旅游体验和质量
  • Webpack 解决:Error: error:0308010C:digital envelope routines::unsupported 的问题