分享

Spark 高级分析:第八章第1,2节 获取数据并使用

feilong 2018-9-14 09:29:01 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 5727
问题导读

1.
从哪里获取样例数据
2.数据的数据结构是怎样的?
3.我们将如何对这些数据进行分析?使用什么工具?



关注最新经典文章,欢迎关注公众号



上一篇:Spark 高级分析:第七章第14节 用Pregel计算平均路径长度
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25202


纽约市出租车数据的时间空间数据分析
没有什么比时间和空间更让我迷惑了,然而,没有什么比不上我烦恼的了。
- Charles Lamb

纽约以其黄色出租车而闻名,叫一辆出租车就像从街头小贩那里吃热狗或乘坐电梯到帝国大厦顶层一样,是纽约之旅的一部分。

纽约的居民有各种各样的建议,这些建议都是基于他们关于最佳乘车时间和地点的趣闻轶事,尤其是在交通高峰期和下雨的时候。但有一天,每个人都会建议你干脆坐地铁:在每天下午4点到5点的换班过程中。在此期间,黄色出租车必须返回他们的调度中心(通常在皇后区),这样一来,一名司机可以当天辞职,下一名司机可以上路,迟到的司机必须支付罚款。

2014年3月,纽约市出租车和豪华轿车委员会(New York City Taxi and Limousine Commission)在他们的twitter账户(@nyctaxi)上分享了一张信息图表,上面显示了道路上出租车的数量以及在任何给定时间都有人乘坐的出租车的比例。果然,从下午4点到6点,路上出租车的数量明显减少,三分之二的出租车都被占用了。

这条推特吸引了自称城市规划专家、地图制作者和数据迷的Chris Whong的注意,他向@nyctaxi账号发了一条推特,想知道他们在信息图表中使用的数据是否公开。

出租车委员会回复说,如果他提交了《信息自由法》(FOIL)的申请,并向委员会提供了他们可以复制数据的硬盘驱动器。在填写完一份PDF表格,购买了两个新的500GB硬盘,并等待了两个工作日之后,Chris获得了从2013年1月1日到12月31日出租车出行的所有数据。更妙的是,他把所有的票价数据都发布在了网上,并以此为基础,对纽约市的交通进行了一系列的可视化处理。

要理解出租车的经济性,一个重要的统计数据是利用率:出租车在路上被一个或多个乘客占用的时间。影响利用率的一个因素是乘客的目的地:出租车,联合广场附近的乘客在中午是更容易找到他们的下一个票价在短短一两分钟,而出租车,某人在史泰登岛可能2点开车回到曼哈顿之前找到他们的下一个。我们想量化这些影响并找出出租车的平均时间找到下一个票价的函数的区扔下乘客在曼哈顿,布鲁克林、布朗克斯、史泰登岛,皇后区或以上(例如,如果他们将乘客送到某个地方以外的城市,像纽瓦克国际机场。)

为了进行这种分析,我们需要处理两种一直出现的数据:时间数据(如日期和时间)和地理空间信息(如经纬度点和空间边界)。在本章中,我们将演示如何使用Scala和Spark处理这些数据类型。

第1节 获取数据

对于这个分析,我们只考虑从2013年1月开始的票价数据,在我们解压缩之后,大约是2.5GB的数据。您可以在http://www.andresmh.com/nyctaxitrips/上访问2013年每个月的数据,并且如果您有足够大的Spark集群可供使用,则可以针对年度的所有数据重新创建下面的分析。现在,让我们在客户机上创建一个工作目录,看看票价数据的结构:
[mw_shl_code=bash,true]$ mkdir taxidata
$ cd taxidata
$ wget https://nyctaxitrips.blob.core.w ... trip_data_1.csv.zip
$ unzip trip_data_1.csv.zip
$ head -n 10 trip_data_1.csv[/mw_shl_code]
报头后的文件的每一行代表CSV格式的单程出租车。对于每次乘坐,我们有出租车的一些属性(徽章编号的散列版本)以及司机(黑客许可证的散列版本,这就是驾驶出租车的许可证所称的),一些关于旅行开始和结束的时间信息,以及经度/纬度乘客的位置和落在哪里的坐标。

第2节 在Spark中使用时间和空间数据

Java平台的一大特色是多年来为它开发的大量代码:对于任何可能需要使用的数据类型或算法,很可能有人编写了一个Java库,您可以用来解决这个问题。因此,存在该库的开源版本是一个不错的机会,您可以下载和使用该库而不必购买许可证。

当然,仅仅因为存在一个库并且可以免费使用,并不意味着您必须依赖它来解决问题;开放源码项目在质量、在bug修复和新特性方面的开发状态以及它们的易用性方面有很多变化-使用API设计和有用的文档和教程的存在。

我们的决策过程与开发人员为应用程序选择库的决策过程稍有不同;我们想要一些适合用于交互式数据分析并且易于在分布式应用程序中使用的东西。特别是,我们希望确保我们将在RDD中使用的主要数据类型实现Serializable接口和/或可以使用像Kryo这样的库轻松地序列化。

此外,我们希望用于交互式数据分析的库尽可能少地依赖外部关系。像Maven和SBT这样的工具可以帮助应用程序开发人员在构建应用程序时处理复杂的依赖关系,但是对于交互式数据分析,我们宁愿简单地获取一个包含我们需要的所有代码的JAR文件,将其加载到SparkShell中,然后开始分析。此外,引入具有大量依赖项的库可能导致与Spark本身所依赖的其他库的版本冲突,这可能导致难以诊断开发人员称为JAR地狱的错误条件。

最后,我们希望我们的库具有相对简单和丰富的API,它们不广泛地使用面向Java的设计模式,例如抽象工厂和访问者。尽管这些模式对于应用程序开发人员来说非常有用,但它们往往会给我们的代码增加很多复杂性,而这些代码与我们的分析无关。甚至更好的是,许多Java库都有Scala包装器,它们利用Scala的能力来减少使用它们的样板代码的数量。

已有(2)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条