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

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

  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/techflow/p/12945793.html
Copyright © 2011-2022 走看看