本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是spark专题的第六篇文章,这篇文章会介绍一个免费的spark平台,我们可以基于这个平台做一些学习实验。
databricks
今天要介绍的平台叫做databricks,它是spark的创建者开发的统一分析平台。单凭spark创建者这几个字大家应该就能体会到其中的分量,其中集成了Scala、Python和R语言的环境,可以让我们在线开发调用云端的spark集群进行计算。
最最关键的是,它提供免费的社区版本,每个开发者都可以获得15GB内存的免费运行环境。非常适合我们初学者进行学习。
说来惭愧我也是最近才知道这么一个平台(感谢sqd大佬的分享),不然的话也不用在本地配置spark的环境了。下面简单介绍一下databricks的配置过程,我不确定是否需要梯子,目测应该可以正常访问。有知道的小伙伴可以在留言板里评论一下。
首先,我们访问:https://community.cloud.databricks.com/
然后点击注册按钮,创建新用户:
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第1张图片](http://img.e-com-net.com/image/info8/57d4656c96f84727816e61bb60e4acbe.jpg)
跳转之后会让我们填写一些个人的基本信息,比如姓名、公司名称、工作邮箱还有使用这个平台的目的,等等。
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第2张图片](http://img.e-com-net.com/image/info8/a9cd5f92e0454e16ba0bfc5821abed8c.jpg)
我实际验证过,这里的公司没有校验,应该可以随意填写,比如你可以填tencent或者是alibaba都是可以的。工作邮箱我们可以留qq邮箱,并不会做公司邮箱后缀校验,所以学生党们可以不用担心,假装自己在某家心仪的公司就可以了。然后选一下目的这个也都很简单大家自由选择,选好了之后,我们点击sign up就好了。
这里说明一下,如果留qq邮箱的话验证邮件会被qq当做垃圾邮件放入垃圾箱,所以记得去垃圾箱里查看。然后我们点击邮件中的链接设置密码就完成了。
配置环境
注册好了之后,我们就可以进行愉快地使用了。首先我们创建一个新的集群,点击菜单栏左侧的clusters然后选择一下spark的版本填一下集群的名称即可。
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第3张图片](http://img.e-com-net.com/image/info8/7ee35e4aaa2645cf9f24bd6f497bc2b4.jpg)
spark的版本可以不用更改,填好名字之后点击create cluster即可。系统有一点点慢,稍微等一会再刷新就会发现列表当中多了一个集群。集群的启动需要一点时间,我们耐心等待即可。
![](http://img.e-com-net.com/image/info8/2b6bed8f0cc544bcb010d485b2d44330.jpg)
等集群创建好了之后, 我们就可以创建notebook进行愉快地编码了。
我们点击home然后选择自己的账号,点击create notebook。
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第4张图片](http://img.e-com-net.com/image/info8/0373b604560342d282bd2529b19f4a55.jpg)
接着会有一个弹框让我们选择语言和集群,这里的语言我们选Python,如果你喜欢也可以换成Scala。集群就选择我们刚才创建的test集群。
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第5张图片](http://img.e-com-net.com/image/info8/4fc4bd716b6b4f07af312bcbe0e77767.jpg)
我们点击create之后就会自动打开一个notebook的页面,我们就可以在里面编码了。为了测试一下环境,我们输入sc,看一下是否会获得sparkContext。
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第6张图片](http://img.e-com-net.com/image/info8/6d980f625ce74510b238615d6e7e2cf7.jpg)
结果和我们预期一致,说明已经配置好了。以后我们就可以在这个集群当中愉快地玩耍和实验了。它除了自带很多给初学者进行学习的数据集之外,还允许我们自己上传文件,可以说是非常良心了。
实验
接下来我们利用这个平台来进行一个spark sql的小实验,来实际体会一下databricks和spark sql的强大。
我们这个实验用到的数据是databricks自带的数据集,一共用到两份数据,分别是机场信息的数据以及航班延误的数据。我们要做的事情很简单,就是将这两份数据join在一起,然后观察一下每一个机场延误的情况。这份数据当中只有美国,所以对我们大多数人没什么价值,仅仅当做学习而已。
首先,我们通过相对路径从databricks的数据集当中获取我们需要的这两份数据:
flightPerFilePath = "/databricks-datasets/flights/departuredelays.csv"
airportsFilePath = "/databricks-datasets/flights/airport-codes-na.txt"
databricks中的数据集都在databricks-datasets路径下,我们可以通过这行代码查看,你会发现这里面数据集非常多,简直是初学者的福音。
display(dbutils.fs.ls("/databricks-datasets"))
接着,我们用dataframe的api从路径当中生成dataframe:
airports = spark.read.csv(airportsFilePath, header='true', inferSchema='true', sep='\t')
flightPerf = spark.read.csv(flightPerFilePath, header='true')
flightPerf.cache()
由于这两份数据一份是csv一份是txt,所以读取的时候格式有所区别。flight是csv文件,我们直接读取即可。而airports是txt文件,所以我们需要指定分隔符,inferSchema这个参数表示系统会自动推断它的schema。
我们读取完之后,notebook会非常友好地把字段的信息一并输出出来,我们可以看到字段的名称和它对应的类型。
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第7张图片](http://img.e-com-net.com/image/info8/2d4bb54592c24191b65c0dd7c5089d50.jpg)
接下来要做的就很简单了,只需要将这两者关联到一起即可。我们观察一下好像并没有发现可以join的key,这是因为这份数据比较特殊,航班当中记录机场的信息并不是通过名称,而是通过特定的代码,在数据集中这个字段叫做origin,而机场数据也有同样的代码,叫做IATA(国际运输协会)。
我们想要将这两份数据join在一起,然后把延误的时间相加,看看哪些机场的延误时间最多,按照延误时间倒序排序。
这个需求如果用SQL写很简单,稍微了解过SQL语法的同学应该就可以写出来:
select a.City, f.origin, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.State = 'WA'
group by a.City, f.origin
order by sum(f.delay) desc
但如果用上dataframe的api来实现则要麻烦得多。虽然代码量并不大,基于流式计算,严格说起来只有一行代码:
from pyspark.sql.functions import desc
airports.join(
flightPerf,
airports.IATA == flightPerf.origin
).select('City', 'origin', 'delay')
.groupBy(['City', 'origin'])
.agg({'delay': 'sum'})
.withColumnRenamed('sum(delay)', 'Delays')
.orderBy(desc('Delays'))
.show()
虽然逻辑上和SQL完全一样,但是写起来还是要费劲一些。所以我们可以考虑将dataframe转化成视图,然后用SQL来操作它:
airports.createOrReplaceTempView('airports')
flightPerf.createOrReplaceTempView('FlightPerformance')
接着我们就可以调用spark.sql来传入SQL代码进行数据处理了:
spark.sql("""
select a.City, f.origin, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.State = 'WA'
group by a.City, f.origin
order by sum(f.delay) desc"""
).show()
这样明显就方便了很多,还没完,由于我们使用的是notebook,在notebook支持许多魔法操作,比如我们可以通过%sql来直接在其中写一段SQL。notebook会自动将它转化成dataframe的语句进行执行,不但如此,还可以以图表的形式展示数据:
%sql
select a.City, f.origin, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.State = 'WA'
group by a.City, f.origin
order by sum(f.delay) desc
输出的结果是这样的:
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第8张图片](http://img.e-com-net.com/image/info8/5985924e65154205805df0fccfb16fef.jpg)
不但如此,我们还可以在下方的选择栏当中选择我们想要的图表展现形式。比如我们可以选择饼图:
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第9张图片](http://img.e-com-net.com/image/info8/ef6c339d67a04db4bd4891d1b6d96746.jpg)
还没完,databricks当中还集成了地图,比如我们想看一下美国各个州的数据,这个很容易写出SQL:
%sql
select a.State, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.Country = 'USA'
group by a.State
得到的结果默认是以柱状图展示:
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第10张图片](http://img.e-com-net.com/image/info8/85db246707c843348275c70bd171a435.jpg)
我们在图表类型当中选择map:
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第11张图片](http://img.e-com-net.com/image/info8/4e174845628a4ce6bdc5d94f8b89f737.jpg)
接下来就是见证奇迹的时刻,会得到一张带着数据的美国地图,美国各个州的情况一览无余。
![想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!_第12张图片](http://img.e-com-net.com/image/info8/b8167fa613a34919aa5d4148a93da55b.jpg)
总结
今天的内容到这里就结束了,关于databricks还有很多实用的功能,由于篇幅限制就不一一介绍了,大家感兴趣的可以自己研究一下。
我个人觉得这个平台非常出色,除了写代码体验以及数据可视化做得非常好之外,功能强大,最关键还是免费的,非常适合我们学生党以及个人学习使用。毕竟对于我们个人而言,拥有一个强大的spark集群并不容易,希望大家都能用好这个平台,有所收获。
今天的文章就到这里,原创不易,扫码关注我,获取更多精彩文章。