今天是 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
结果和我们预期一致, 说明已经配置好了. 以后我们就可以在这个集群当中愉快地玩耍和实验了. 它除了自带很多给初学者进行学习的数据集之外, 还允许我们自己上传文件, 可以说是非常良心了.
实验
接下来我们利用这个平台来进行一个 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 集群并不容易, 希望大家都能用好这个平台, 有所收获.
来源: https://www.cnblogs.com/techflow/p/12945793.html