-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
spark sql在喜马拉雅的使用之xql #21
Comments
GJ |
期待开源 |
期待开源 |
多个xql任务是串行还是并行的呢?多个sparksession? |
@Zhifeiyu 多个sparkSession,另外你可以上面的ppt,我们架构现在升级成了cluster模式了 |
好的。tks。 |
怎么在一个jvm创建多个sparksession呢? 已经设置了true了,conf.set("spark.driver.allowMultipleContexts", "true"); |
@Zhifeiyu 你没搞清楚sparkContext和sparkSession的区别吧,建议把官方文档过一下 |
@Zhifeiyu 在 SparkSession类里面有一个这个方法:public SparkSession newSession(),,你可以参考 API :http://spark.apache.org/docs/latest/api/java/index.html |
@Rayn-liuwei 好的。谢了 |
@cjuexuan 有准备什么时候开源出来吗 |
@junjiem 在公司提过,只能说我们还在努力争取中,但是思路是可以开源的,这里或者邮件都可以问我 |
@cjuexuan xql是什么时候支持开源呢 |
围观,23年进入喜马,我就在想 xql是啥?没想到 遇到喜马元老了 |
喜马拉雅ql |
spark sql在喜马拉雅的使用之xql
什么是xql
在大数据领域,发展到今天hive依然是一个非常有意义的项目,因为它把工程师都懂的sql直接用到了大数据领域,但是它也存在一些问题,比如运行速度慢这个是最明显的,大数据领域中的先驱者们都为之做了各种优化,和hive集成的项目还是非常多的。
spark作为目前一站式的数据处理框架,在etl,数据分析与统计,流式处理,机器学习中都展现了很强的竞争力,而spark sql是目前spark社区中投入最多,而且期望最高的一个核心处理组件,由于可以使用现有和hive表,共用hive的metadata,而且使用spark sql能很大程度上提高我们的生产力,所以我们将sql也带到了喜马拉雅,并且开发了一套基于spark sql上层的dsl engine,用于处理etl和数据分析这一块,本文主要介绍我们对spark sql做的一些封装和落地
在使用场景中,我们主要总结了数据分析工程师和数据挖掘工程师的使用习惯,总结了以下需求
基于这些需求,我们调研了市面上的一些产品,presto在处理数据源管理上还是做的不错的,但他的展示显然达不到算法工程师的要求,apache zeppelin展示可以达到我们的要求,交互也还可以,但处理数据源的关联做的不够好,而且很多时候需求写python代码或者scala代码,而bi更擅长的是写sql,所以也不能完全满足我们的要求。针对以上需求我们整理总结,决定开发一套自己的系统,用于解决数据源的关联问题,而且要提供一些http接口给其他语言的api进行交互,而且类型存储过程的sql编程显然也是我们想要的,我们可以用一批sql去描述我们的逻辑,而不是写一个没人能看懂的复杂sql,所以我们开发了一个叫xql的项目
xql是一个data flow language,我们可以把一行sql的结果注册一个临时表,而且这个临时表可以在后面使用,这使得我们需要写嵌套query的概率大大的降低了。sql这个东西就是简单的query很简单。一旦开始嵌套了,就离地狱不远了
语法简介
我们在常规的sql的query语法中又加入两个的dsl的语法:load和save
load 语法
其中format就是我们加载的数据源的格式,比如jdbc,hbase等数据格式,而params表示这种格式下的特殊含义,比如在jdbc中这里就是实例名.库名.表名,而在文件格式下这里就是路径,在hbase中则是表名,schema则是一个映射关系,比如hbase是一个二级的map,那我们要变成sql中平铺关系,就需要一个这样的映射关系,再比如我们的数据是存的string,我在spark中想变成int类型,那么也可以在这里指定类型,如
(:uid as uid,cf1:name as realname,cf1:age int),而condition主要用来做数据的filter,比如我的hdfs路径按照天存,我们就关心2016/01/01到2016/01/10这几天的数据,虽然本身有partition discovery,但我们还是提供了另一种方式,比如where path between '?' and '?'这种方式去进行筛选,这个同样可以用在hbase中,在hbase中则可以指定rowKey的范围来作为一个scan的filter,而在jdbc中,这就会作为条件被拼接到jdbc的查询语句中,而最后的tableName则是spark sql的一个tempTable的名字,因为我们会按照用户的逻辑注册tempTable,所以这个名字也就是你在后续逻辑中可以使用的一个名字
save 语法
其中format和params和之前作用是一致的,而tableName则是一张已经存在的表名,而saveMode则如果保存的目标位置有数据时候的策略,比如是追加还是覆盖,或者报错,最后的partitionBy则用于分区,这个选项可以在落盘到hdfs时候按照一些字段和udf进行分区落盘
query语法
query语法和原生的spark sql基本类似,由于我们需要将查询的结果注册成表,所以在已有sql语句后面加入了一个as tempTable的语法,类似
select * from xxxxx as my_temp_table_name
,这个my_temp_table_name在后续逻辑中就可以被复用综合的一个小demo
组件介绍
如何解决我们设计之初的痛点问题
效果图
The text was updated successfully, but these errors were encountered: