想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!

今天是spark专题的第六篇文章,这篇文章会介绍一个免费的spark平台,我们可以基于这个平台做一些学习实验。

databricks

今天要介绍的平台叫做databricks,它是spark的创建者开发的统一分析平台。单凭spark创建者这几个字大家应该就能体会到其中的分量,其中集成了Scala、Python和R语言的环境,可以让我们在线开发调用云端的spark集群进行计算。

最最关键的是,它提供免费的社区版本,每个开发者都可以获得15GB内存的免费运行环境。非常适合我们初学者进行学习。

说来惭愧我也是最近才知道这么一个平台(感谢sqd大佬的分享),不然的话也不用在本地配置spark的环境了。下面简单介绍一下databricks的配置过程,我不确定是否需要梯子,目测应该可以正常访问。有知道的小伙伴可以在留言板里评论一下。

首先,我们访问:https://community.cloud.databricks.com/

然后点击注册按钮,创建新用户:

跳转之后会让我们填写一些个人的基本信息,比如姓名、公司名称、工作邮箱还有使用这个平台的目的,等等。

我实际验证过,这里的公司没有校验,应该可以随意填写,比如你可以填tencent或者是alibaba都是可以的。工作邮箱我们可以留qq邮箱,并不会做公司邮箱后缀校验,所以学生党们可以不用担心,假装自己在某家心仪的公司就可以了。然后选一下目的这个也都很简单大家自由选择,选好了之后,我们点击sign up就好了。

这里说明一下,如果留qq邮箱的话验证邮件会被qq当做垃圾邮件放入垃圾箱,所以记得去垃圾箱里查看。然后我们点击邮件中的链接设置密码就完成了。

配置环境

注册好了之后,我们就可以进行愉快地使用了。首先我们创建一个新的集群,点击菜单栏左侧的clusters然后选择一下spark的版本填一下集群的名称即可。

spark的版本可以不用更改,填好名字之后点击create cluster即可。系统有一点点慢,稍微等一会再刷新就会发现列表当中多了一个集群。集群的启动需要一点时间,我们耐心等待即可。

等集群创建好了之后, 我们就可以创建notebook进行愉快地编码了。

我们点击home然后选择自己的账号,点击create notebook。

接着会有一个弹框让我们选择语言和集群,这里的语言我们选Python,如果你喜欢也可以换成Scala。集群就选择我们刚才创建的test集群。

我们点击create之后就会自动打开一个notebook的页面,我们就可以在里面编码了。为了测试一下环境,我们输入sc,看一下是否会获得sparkContext。

image-20200517200340320
image-20200517200340320

结果和我们预期一致,说明已经配置好了。以后我们就可以在这个集群当中愉快地玩耍和实验了。它除了自带很多给初学者进行学习的数据集之外,还允许我们自己上传文件,可以说是非常良心了。

实验

接下来我们利用这个平台来进行一个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会非常友好地把字段的信息一并输出出来,我们可以看到字段的名称和它对应的类型。

接下来要做的就很简单了,只需要将这两者关联到一起即可。我们观察一下好像并没有发现可以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

输出的结果是这样的:

不但如此,我们还可以在下方的选择栏当中选择我们想要的图表展现形式。比如我们可以选择饼图:

还没完,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

得到的结果默认是以柱状图展示:

我们在图表类型当中选择map:

接下来就是见证奇迹的时刻,会得到一张带着数据的美国地图,美国各个州的情况一览无余。

总结

今天的内容到这里就结束了,关于databricks还有很多实用的功能,由于篇幅限制就不一一介绍了,大家感兴趣的可以自己研究一下。

我个人觉得这个平台非常出色,除了写代码体验以及数据可视化做得非常好之外,功能强大,最关键还是免费的,非常适合我们学生党以及个人学习使用。毕竟对于我们个人而言,拥有一个强大的spark集群并不容易,希望大家都能用好这个平台,有所收获。

今天的文章就到这里,原创不易,扫码关注我,获取更多精彩文章。