“Spark全栈:通过报表探索数据”的版本间的差异
第77行: | 第77行: | ||
我们正在做的事情可以被描述为创建半结构化数据间交互式的本体关系。把我们的流程围绕着构建这一结构关系拆开,对我们来说有几个作用。首先,它创建了一小批工作任务(每个实体一个),可以有效地进入敏捷开发的冲刺。这实现了一种数据敏捷性,并可以将我们的应用程序扩展为更适合浏览的状态。而这反过来又让用户可以自由单击并探索数据集,从而将团队与实际数据的情况连接起来。正如你现在所知,这是敏捷数据科学的一个主题。 | 我们正在做的事情可以被描述为创建半结构化数据间交互式的本体关系。把我们的流程围绕着构建这一结构关系拆开,对我们来说有几个作用。首先,它创建了一小批工作任务(每个实体一个),可以有效地进入敏捷开发的冲刺。这实现了一种数据敏捷性,并可以将我们的应用程序扩展为更适合浏览的状态。而这反过来又让用户可以自由单击并探索数据集,从而将团队与实际数据的情况连接起来。正如你现在所知,这是敏捷数据科学的一个主题。 | ||
+ | |||
+ | ==改进航空公司页面== | ||
+ | 我们有了航空公司的页面,下面就给它加上一些多媒体内容,包括文本和图片。我们首先从主数据集中获取航空公司代码列表. | ||
+ | |||
+ | ===给航空公司代码加上名称=== | ||
+ | 为了给航空公司链接更多数据,我们需要获取每个航空公司代码对应的航空公司名字。这一数据可以在第5章中从OpenFlights(http://openflights.org/data.html)上下载的航空公司数据库中找到。让我们看一下airlines.dat,这里我们已经把它重命名为airlines.csv: | ||
+ | |||
+ | [[文件:bd21081405.png|600px]] | ||
+ | |||
+ | 我们仅保留数据中的航空公司名字和两个字母的航空公司代码,然后把它和准点情况数据集中去重的航空公司代码做表连接: | ||
+ | |||
+ | [[文件:bd21081406.png|600px]] |
2021年8月14日 (六) 10:16的版本
目录
前言
接下来就是我们的第三个敏捷开发冲刺周期了,我们要把图表页面进一步开发为完整的报表。在这一步骤中,我们会给图表增添交互性,把静态页面变成动态页面,通过链接的网络、表和图表的相关实体使得数据可供探索。这些都是数据价值金字塔中报表阶段的特性
本章的示例代码在Agile_Data_Code_2/tree/master/ch06中
git clone https://github.con/rjurney/Agile_Data_Code_2.git
提取航空公司为实体
为了构建报表,我们需要组合数据集的各种视图。构建这些视图对应的工作是枚举实体。我们在上一章中创建了实体“飞机”,它会是我们继续创建其他实体及建立实体间的关联关系以构建报表的基础。如上一章所述,在我们开始创建数据的视图之前,我们需要构建一个网页来展示图表与表格。那么下面我们就来创建一个新的实体“航空公司”,并且为每家航空公司提供一个页面。
我们从收集一家特定航空公司所有飞机的机尾编号入手。每个商业航班都是由某一家航空公司运营的,各个航空公司又拥有各自的机队,以及基地机场设施和人员,这些都是航空公司业务的核心资产。我们已经为每架飞机创建了页面,因此我们可以利用这一数据来创建每个航空公司的全部机尾编号列表。
使用PySpark把航空公司定义为飞机的分组
我们从准备每个航空公司的飞机机尾编号列表入手,代码如ch06/ extract_airlines.py文件所展示的。这会成为航空公司页面的基础:
# Load the on-time parquet file on_time_dataframe = spark.read.parquet('data/on_time_performance.parquet') # The first step is easily expressed as SQL: get all unique tail numbers for each airline on_time_dataframe.registerTempTable("on_time_performance") carrier_airplane = spark.sql( "SELECT DISTINCT Carrier, TailNum FROM on_time_performance" ) # Now we need to store a sorted group for each Carrier, along with a fleet count airplanes_per_carrier = carrier_airplane.rdd\ .map(lambda nameTuple: (nameTuple[0], [nameTuple[1]]))\ .reduceByKey(lambda a, b: a + b)\ .map(lambda tuple: { 'Carrier': tuple[0], 'TailNumbers': sorted( filter( lambda x: x is not None and x != '', tuple[1] # empty string tail numbers were getting through ) ), 'FleetCount': len(tuple[1]) } ) airplanes_per_carrier.count() # 14 # Save to Mongo in the airplanes_per_carrier relation import pymongo_spark pymongo_spark.activate() airplanes_per_carrier.saveToMongoDB( 'mongodb://localhost:27017/agile_data_science.airplanes_per_carrier' )
在MongoDB中查询航空公司数据
下面来验证数据已经在Mongo中:db.airplanes_per_carrier.find()
在Flask中构建航空公司页面
我们得到了一个简易的航空公司页面,列出了航空公司的机队(见图6-2)。不用担心,我们稍后还会再装点这个页面的。在交付好产品之前,交付一些难看的东西也是很有必要的!
添加回到航空公司页面的链接
创建了航空公司这个实体的页面之后,我们要为先前创建的飞机页面添加跳转回航空公司页面的链接,还有第5章中创建的搜索页面和航班页面也需要添加。我们可以修改飞机、航班及搜索页面的模板来实现这个功能。
创建一个包括所有航空公司的主页
但是谁记得住那些航空公司代码呢?(好吧,我能记住)我们需要给用户一个入口,所以我们要创建一个主页,列出在美国运营的所有航空公司。
我们同时把这个页面设置为本应用的默认首页index.html:
整理半结构化数据的本体关系
现在我们可以尽情探索航空公司、飞机、航班数据了!这是一件大事,对吧?可能算不上,但这是一个好的开始。让我们进一步扩展这个功能,给航班页面里面的飞机和航空公司加上链接。
现在我们可以在查看航班时看到飞机和航空公司的信息——它们的属性及其之间的关系(见图6-4)。这样的结构非常清晰,并且是推荐的一种简单的形式。
我们正在做的事情可以被描述为创建半结构化数据间交互式的本体关系。把我们的流程围绕着构建这一结构关系拆开,对我们来说有几个作用。首先,它创建了一小批工作任务(每个实体一个),可以有效地进入敏捷开发的冲刺。这实现了一种数据敏捷性,并可以将我们的应用程序扩展为更适合浏览的状态。而这反过来又让用户可以自由单击并探索数据集,从而将团队与实际数据的情况连接起来。正如你现在所知,这是敏捷数据科学的一个主题。
改进航空公司页面
我们有了航空公司的页面,下面就给它加上一些多媒体内容,包括文本和图片。我们首先从主数据集中获取航空公司代码列表.
给航空公司代码加上名称
为了给航空公司链接更多数据,我们需要获取每个航空公司代码对应的航空公司名字。这一数据可以在第5章中从OpenFlights(http://openflights.org/data.html)上下载的航空公司数据库中找到。让我们看一下airlines.dat,这里我们已经把它重命名为airlines.csv:
我们仅保留数据中的航空公司名字和两个字母的航空公司代码,然后把它和准点情况数据集中去重的航空公司代码做表连接: