zoukankan      html  css  js  c++  java
  • 想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!

    本文始发于个人公众号:TechFlow,原创不易,求个关注


    今天是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='	')
    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集群并不容易,希望大家都能用好这个平台,有所收获。

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

  • 相关阅读:
    定义函数的三种形式
    函数的定义
    文件修改的两种方式
    文件的高级应用
    with管理文件操作上下文
    SQL Server 823,824 错误
    SQL Server 无法启动的 4 种原因
    SQL Server 查看正在运行的事务信息的 2 种方法。
    MySQL 指定数据库字符集的 3 种方法。
    MYSQL 注释的 3 方法
  • 原文地址:https://www.cnblogs.com/techflow/p/12945793.html
Copyright © 2011-2022 走看看