在Spark中如何通过YDB实现比原生Spark性能高100倍的多表关联
2016-01-08 13:39
357 查看
多表关联Join在Spark数据分析中是一个不可或缺的一部,我们以商品交易记录表(trade表)与用户信息表为例(user表)来阐述下如何实现高性能的多表关联分析。
经常会遇到这种情形,我们需要先找出【某一个省份】【工商银行】【交易金额在150~160元】的所有用户,并通过与用户信息表进行关联得到该用户的手机号,性别,年龄,职业等信息。
Spark的传统做法是对双表都进行暴力扫描,需要对trade表与user表都进行一次完整的扫描,根据扫描出来的结果在进行进一步的关联。用户信息表(User表)的数据量通常来说也是非常大的,运营商,阿里,腾讯都会有达数十亿条,数万维度的用户信息表,Spark默认方式的为将User表全部读取后在过滤的方式,性能是很慢的,我们可以换个方式,将这个过程对调一下,先进行过滤,在对过滤后的结果进行扫描,经过过滤后,需要处理的数据条数,是原先总量的万分之一或者千分之一,性能自然就会得到数百倍的提升。
其实这种方式大家并不陌生,传统数据库如mysql在做多表关联的时候,对关联的字段创建索引与不创建索引关联的效率相差很多,主要原因也是因为创建索引后,就不需要在对“用户表”,进行“全表扫描了”,仅仅读取需要的数据,关联效率自然就高了。
ydb支持这种通过索引方式的先过滤,后关联的方式,要实现这个需要进行四步骤。如下图所示:
第一步:生成中间关联索引-相关示例SQL写法
1.1 导出要关联的小索引到/data/ycloud/ydb/export/20160108120656_0的src目录下
select nickname from ydb_example_trade where ydbpartion in (20151011) and province='辽宁省' and bank='工商银行' and amt>150 and amt<160 and ydbkv='export.joinchar:%01' and ydbkv='export.max.return.docset.size:100000000' and ydbkv='max.return.docset.size:100000000'
and ydbkv='async.run:true' and ydbkv='export.type:index' and ydbkv='export.path:/data/ycloud/ydb/export/20160108120656_0/src' limit 0,10
1.2 将导出的小索引,合并生成大索引,并存储到/data/ycloud/ydb/export/20160108120656_0的index目录下
select nickname from ydb_example_trade where ydbpartion in (20151011) and ydbkv='export.joinchar:%01' and ydbkv='export.max.return.docset.size:100000000' and ydbkv='max.return.docset.size:100000000' and ydbkv='join.pre.split:%01' and ydbkv='async.run:true'
and ydbkv='join.pre.src:/data/ycloud/ydb/export/20160108120656_0/src' and ydbkv='join.pre.index:/data/ycloud/ydb/export/20160108120656_0/index' limit 0,10
第二步,创建Ydb Trade映射到Spark的视图表
CREATE external TABLE spark_on_ydb_left_0 (
usernick_left string,tradetype string,amt string
)STORED BY 'cn.net.ycloud.ydb.handle.YdbStorageHandler'
TBLPROPERTIES (
"ydb.handler.hostport"="101.200.130.48:8080",
"ydb.handler.sql.key"="ydb.sql.spark_on_ydb_left_0",
"ydb.handler.sql"="select nickname as usernick_left,tradetype as tradetype,amt as amt from ydb_example_trade where ydbpartion in ('20151011') and province='辽宁省' and bank='工商银行' and amt>150 and amt<160 and ydbkv='export.joinchar:%01' and ydbkv='export.max.return.docset.size:100000000'
and ydbkv='max.return.docset.size:100000000' limit 0,10000 "
)
第三步,使用第一部生成的关联索引,创建Ydb User映射到Spark的视图表
CREATE external TABLE spark_on_ydb_right_0 (
usernick_right string,consume string,zhiye string,phonenum string,sex string,age string
)STORED BY 'cn.net.ycloud.ydb.handle.YdbStorageHandler'
TBLPROPERTIES (
"ydb.handler.hostport"="101.200.130.48:8080",
"ydb.handler.sql.key"="ydb.sql.spark_on_ydb_right_0",
"ydb.handler.sql"="select usernick as usernick_right,ydb_consume as consume,ydb_zhiye as zhiye,phonenum as phonenum,ydb_sex as sex,ydb_age as age from ydb_example_shu where ydbpartion in ('20151231') and ydb_day='20151202' and ydbkv='export.joinchar:%01'
and ydbkv='expo
4000
rt.max.return.docset.size:100000000' and ydbkv='max.return.docset.size:100000000' andydbkv='join.in:usernick@/data/ycloud/ydb/export/20160108132631_0/index@nickname' limit 0,10000 "
)
第四步,开始关联查询
select l.usernick_left,l.tradetype,l.amt,r.usernick_right,r.consume,r.zhiye,r.phonenum,r.sex,r.age from spark_on_ydb_left_0 l join spark_on_ydb_right_0 r on(l.usernick_left=r.usernick_right) limit 100
这四个步骤,我们也准备了SparkExampleJoin示例程序放在了ydb的安装包下面,供您参考。
该功能在ydb1.0.7及以后版本可用,1.0.7版本下载地址:
http://yunpan.cn/cubwSX4MN9ACY 访问密码 48df
也可以访问这里获取更新版本的YDB http://ycloud.net.cn/yyydb
经常会遇到这种情形,我们需要先找出【某一个省份】【工商银行】【交易金额在150~160元】的所有用户,并通过与用户信息表进行关联得到该用户的手机号,性别,年龄,职业等信息。
Spark的传统做法是对双表都进行暴力扫描,需要对trade表与user表都进行一次完整的扫描,根据扫描出来的结果在进行进一步的关联。用户信息表(User表)的数据量通常来说也是非常大的,运营商,阿里,腾讯都会有达数十亿条,数万维度的用户信息表,Spark默认方式的为将User表全部读取后在过滤的方式,性能是很慢的,我们可以换个方式,将这个过程对调一下,先进行过滤,在对过滤后的结果进行扫描,经过过滤后,需要处理的数据条数,是原先总量的万分之一或者千分之一,性能自然就会得到数百倍的提升。
其实这种方式大家并不陌生,传统数据库如mysql在做多表关联的时候,对关联的字段创建索引与不创建索引关联的效率相差很多,主要原因也是因为创建索引后,就不需要在对“用户表”,进行“全表扫描了”,仅仅读取需要的数据,关联效率自然就高了。
ydb支持这种通过索引方式的先过滤,后关联的方式,要实现这个需要进行四步骤。如下图所示:
第一步:生成中间关联索引-相关示例SQL写法
1.1 导出要关联的小索引到/data/ycloud/ydb/export/20160108120656_0的src目录下
select nickname from ydb_example_trade where ydbpartion in (20151011) and province='辽宁省' and bank='工商银行' and amt>150 and amt<160 and ydbkv='export.joinchar:%01' and ydbkv='export.max.return.docset.size:100000000' and ydbkv='max.return.docset.size:100000000'
and ydbkv='async.run:true' and ydbkv='export.type:index' and ydbkv='export.path:/data/ycloud/ydb/export/20160108120656_0/src' limit 0,10
1.2 将导出的小索引,合并生成大索引,并存储到/data/ycloud/ydb/export/20160108120656_0的index目录下
select nickname from ydb_example_trade where ydbpartion in (20151011) and ydbkv='export.joinchar:%01' and ydbkv='export.max.return.docset.size:100000000' and ydbkv='max.return.docset.size:100000000' and ydbkv='join.pre.split:%01' and ydbkv='async.run:true'
and ydbkv='join.pre.src:/data/ycloud/ydb/export/20160108120656_0/src' and ydbkv='join.pre.index:/data/ycloud/ydb/export/20160108120656_0/index' limit 0,10
第二步,创建Ydb Trade映射到Spark的视图表
CREATE external TABLE spark_on_ydb_left_0 (
usernick_left string,tradetype string,amt string
)STORED BY 'cn.net.ycloud.ydb.handle.YdbStorageHandler'
TBLPROPERTIES (
"ydb.handler.hostport"="101.200.130.48:8080",
"ydb.handler.sql.key"="ydb.sql.spark_on_ydb_left_0",
"ydb.handler.sql"="select nickname as usernick_left,tradetype as tradetype,amt as amt from ydb_example_trade where ydbpartion in ('20151011') and province='辽宁省' and bank='工商银行' and amt>150 and amt<160 and ydbkv='export.joinchar:%01' and ydbkv='export.max.return.docset.size:100000000'
and ydbkv='max.return.docset.size:100000000' limit 0,10000 "
)
第三步,使用第一部生成的关联索引,创建Ydb User映射到Spark的视图表
CREATE external TABLE spark_on_ydb_right_0 (
usernick_right string,consume string,zhiye string,phonenum string,sex string,age string
)STORED BY 'cn.net.ycloud.ydb.handle.YdbStorageHandler'
TBLPROPERTIES (
"ydb.handler.hostport"="101.200.130.48:8080",
"ydb.handler.sql.key"="ydb.sql.spark_on_ydb_right_0",
"ydb.handler.sql"="select usernick as usernick_right,ydb_consume as consume,ydb_zhiye as zhiye,phonenum as phonenum,ydb_sex as sex,ydb_age as age from ydb_example_shu where ydbpartion in ('20151231') and ydb_day='20151202' and ydbkv='export.joinchar:%01'
and ydbkv='expo
4000
rt.max.return.docset.size:100000000' and ydbkv='max.return.docset.size:100000000' andydbkv='join.in:usernick@/data/ycloud/ydb/export/20160108132631_0/index@nickname' limit 0,10000 "
)
第四步,开始关联查询
select l.usernick_left,l.tradetype,l.amt,r.usernick_right,r.consume,r.zhiye,r.phonenum,r.sex,r.age from spark_on_ydb_left_0 l join spark_on_ydb_right_0 r on(l.usernick_left=r.usernick_right) limit 100
这四个步骤,我们也准备了SparkExampleJoin示例程序放在了ydb的安装包下面,供您参考。
该功能在ydb1.0.7及以后版本可用,1.0.7版本下载地址:
http://yunpan.cn/cubwSX4MN9ACY 访问密码 48df
也可以访问这里获取更新版本的YDB http://ycloud.net.cn/yyydb
相关文章推荐
- 在Spark中如何通过YDB实现比原生Spark性能高100倍的多表关联
- 在Spark中如何通过YDB实现比原生Spark性能高100倍的多表关联
- 在Spark中如何通过YDB实现比原生Spark性能高100倍的多表关联
- 在Spark中如何通过YDB实现比原生Spark性能高100倍的多表关联
- 在Spark中如何通过YDB实现比原生Spark性能高100倍的多表关联
- 在Spark中如何通过YDB实现比原生Spark性能高100倍的多表关联
- 记录部件的业务表条件
- maven:从一个已有项目生成一个archetype(未完成)
- CDI技术第六步:自定义选择器注解
- 12.静态单元格的使用
- NSDate详解及获取当前时间等常用操作
- cmd连接mysql的方法详解
- caffe训练模型输出到log.txt
- Android数据存储之SharedPreferences使用
- 【android】LayoutInflater.inflate方法的详解及xml根元素的布局参数不起作用的问题
- java中volatile关键字的含义 原子类型变量使用
- windows mobile 只能运行一个程序实例
- 判断输入的字符串是否是下划线 数字 字母
- A successful Git branching model
- 菜鸟之路-浅谈设计模式之观察者模式