在Spark中通过YDB实现比原生Spark性能高100倍的多表关联

Spark中通过YDB实现比原生Spark性能高100倍的多表关联

多表关联JoinSpark数据分析中是一个不可或缺的一部,我们以商品交易记录表(trade表)与用户信息表为例(user表)来阐述下如何实现高性能的多表关联分析。

经常会遇到这种情形,我们需要先找出【某一个省份】【工商银行】【交易金额在150~160元】的所有用户,并通过与用户信息表进行关联得到该用户的手机号,性别,年龄,职业等信息。

Spark的传统做法是对双表都进行暴力扫描,需要对trade表与user表都进行一次完整的扫描,根据扫描出来的结果在进行进一步的关联。用户信息表(User)的数据量通常来说也是非常大的,运营商,阿里,腾讯都会有达数十亿条,数万维度的用户信息表,Spark默认方式的为将User表全部读取后在过滤的方式,性能是很慢的,我们可以换个方式,将这个过程对调一下,先进行过滤,在对过滤后的结果进行扫描,经过过滤后,需要处理的数据条数,是原先总量的万分之一或者千分之一,性能自然就会得到数百倍的提升。

其实这种方式大家并不陌生,传统数据库如MySQL在做多表关联的时候,对关联的字段创建索引与不创建索引关联的效率相差很多,主要原因也是因为创建索引后,就不需要在对用户表,进行全表扫描了,仅仅读取需要的数据,关联效率自然就高了。

YDB中,针对这种大表与小表的关联,可以通过广播将小表的数据广播到每个节点上去,与原生spark不同的是,广播到每个节点后,广播数据是直接基于索引进行关联,而不是采用暴力遍历的方式,这样性能就会有较大幅度的提升。