解决spark sql关联(join)查询使用“or“缓慢的问题
来源:互联网 发布:国外发展人工智能吗 编辑:程序博客网 时间:2024/05/22 12:44
1.需求描述
将a表的数据与b表的两个字段进行关联,输出结果
a表数据约24亿条
b表数据约30万条
2.优化效果
优化后执行时间从数天减少到数分钟
3.资源配置
spark 1.4.1
200core,600G RAM
4.代码简化版(优化前)
sqlContext.sql("name,ip1,ip2 as ip from table_A where name is not null and ip2 is not null or ip2 is not null) group by name,ip1,ip2").registerTempTable("a")sqlContext.read.parquet("table_B").registerTempTable("b")sqlContext.sql('''select ip, count(1) as cnt from (select bb.ip as ip, aa.name as name from (select * from b where ip != '')bb left join (select * from a)aa on (bb.ip=aa.ip2 or bb.ip=aa.ip1) group by bb.ip, aa.name)group by ip''').write.json("result")
5.代码简化版(优化后)
后来经过排查发现是使用or语句导致的运行缓慢,于是将两个条件查询注册成两张表,然后union成一张表,union操作其实只是合并两个rdd的分区,基本没有什么开销。然后在对这张表进行关联操作
代码如下:
//查询出需要的字段并进行缓存,因为下面要查询2次sqlContext.sql("CACHE TABLE all AS select name,ip1,ip2 from table_A where name is not null and (ip1 is not null or ip2 is not null) group by name,ip1,ip2")sqlContext.sql("select name,ip1 from all group by name,ip1").registerTempTable("temp1")sqlContext.sql("select name,ip2 from all group by name,ip2").registerTempTable("temp2")sqlContext.sql("select name,ip from (select * from temp1 union all select * from temp2)a group by name,ip").registerTempTable("a")sqlContext.read.parquet("table_B").registerTempTable("b")sqlContext.sql('''select ip, count(1) as cnt from (select bb.ip as ip, aa.name as name from (select * from b where ip != '')bb left join (select * from a)aa on bb.ip=aa.ip group by bb.ip, aa.name)group by ip''').write.json("result")
0 0
- 解决spark sql关联(join)查询使用“or“缓慢的问题
- Hive解决SQL的join or
- SQL 各种join关联查询
- spark-sql 关联问题
- SQL 查询时join的顺序问题
- hql的关联查询 join
- 使用hql或条件查询解决一对多关联查询的N+1查询问题
- SQL语句-- LEFT JOIN 关联表查询
- 正确使用HAXM解决Android模拟器运行缓慢的问题
- 使用INNER JOIN ON 多表关联查询,获取指定用户下指定权限的资源SQL:
- 使用连接查询解决一对一实体关联查询时的懒加载问题
- Sql语句用left join 解决多表关联问题(关联套关联,例子和源码)
- Yii2 使用九 join关联表查询
- SQL查询AND和OR的使用
- 使用 gooreplacer 解决 stackoverflow 网站缓慢问题
- 当Dao层继承了HibernateDaoSupport,使用底层SQL语句,session获取的方法,以及解决关联查询no session的问题
- SQL的关联查询
- SQL--使用With As 解决查询嵌套的问题
- ios开发之c语言基础-结构体经典题目
- hdu1846 Brave Game
- yii2 分页
- 牛顿迭代法实现平方根函数
- hdoj Equivalent Sets 3836 (强连通分量 最少添加几条边使图强连通)
- 解决spark sql关联(join)查询使用“or“缓慢的问题
- ubunt连接手机adb devices ???? no permission
- JAVA中,接口和抽象类的区别
- Java中的集合(下)
- 在Windows安装wamp和drupal的流程和常见问题
- WPF、WinForm(C#)多线程编程并更新界面(UI)
- iOS开发之c语言基础-高级指针
- Trie树进阶:Double-Array Trie原理及状态转移过程详解
- NIO 笔记