基于Spark DataFrame的数据仓库框架

本文探讨了如何使用Spark DataFrame解决数据处理能力和跨数据源访问的问题。通过将计算压力转移到Spark集群,优化了对MySQL等传统数据库的处理,同时提出实时与非实时数据的处理策略。对于跨表操作,Spark SQL提供了统一的接口。文中还分享了关键代码示例,如数据源的读取和SQL解析,以及高效的加载系统。
摘要由CSDN通过智能技术生成

数据存储的多样性,对数据分析、挖掘带来众多不变。应用瓶颈表现在两个方面:

1.      传统数据库mysql等的数据处理能力有限,随着数据量的增加,join、groupby、orderby等操作出现速度极慢,甚至将机器资源耗尽、不能运行的情况;另一方面,将数据存储转移到分布式系统比如hdfs的代价太大。

2.      不能进行跨数据源的访问。比如对hive table、htable、mysql中的数据进行混合查询。以前的普遍做法是将一个数据源的数据导入另一数据源。这其中的技术应用包括sqoop、jdbc、hive外表等。此种方法,处理周期长,且sqoop对特殊字符的处理有些问题。

 

利用spark dataframe,针对以上两个问题,解决方案:

1.      针对传统数据库,比如mysql,将计算压力转移到hadoop(spark-on-yarn)集群中;针对是否有实时性要求的数据分析需求,分为两条线处理:
1)  实时数据:利用下图中的sparkquery system,将mysql tables转换为dataframe,执行对dataframe的sql运算;
2) 非实时数据:此为大部分需求,一般分析截止到前一天的数据,此种情况下,利用图中spark loading system,每天定时将数据导入hdfs,以parquet表(列式存储)格式存储。
此种情况下,mysql只有导表的压力,此压力相当于执行select * from table limit $spark_partition_num,其中spark_partition_num是spark在导入mysql数据时,根据表情况进行的分片大小,用户可设定。

2.      针对跨表操作,通过spark query system将各类数据源转换为dataframe并利用spark sql运行跨表的sql运算。



Sql parser: 提取需要导入的表名,按需导入。Key code:
  def getTables(sql: String)= {

   tables_name=""

   valsqlparser =new TGSqlParser(EDbVendor.dbvmysql)

   sqlparser.sqltext = sql

   valret =sqlparser.parse();

   if(ret==0) {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值