云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

企业网站_郑州网站建设哪家好_代金券

小七 141 0

用apachespark和Databricks分析欧洲足球联盟的比赛

在Databricks中试试这个笔记本系列介绍全球体育市场是巨大的,由球员、球队、联盟、球迷俱乐部、赞助商等组成,所有这些实体以各种方式相互作用,产生了大量的数据。这些数据中的一部分用于内部,以帮助做出更好的决策,媒体行业中有许多使用相同的数据来创建更好的产品并吸引/留住观众。体育和媒体行业开始利用大数据的几种方式是:分析导致足球进球、足球触地得分或棒球本垒打等的场地条件和事件(传球、球员位置等)。评估不同场上位置球员组合的输赢百分比。跟踪运动员或团队在年度/赛季的表现图。最终,这些行业需要构建一个端到端的数据管道,包括三个功能组件:数据工程、数据分析和机器学习。为了从大数据中提取这些见解,体育和媒体公司需要构建端到端的数据管道,我们解决这些问题的方法是选择一个提供这些功能的统一平台。Databricks提供了一个统一的分析平台,它将大数据和人工智能结合在一起,并允许组织中的不同角色在一个工作区中进行协作。在本博客中,我们将探讨如何:使用Databricks笔记本来简化ETL(数据工程)。使用内置和第三方可视化与笔记本电脑,以简化您的数据分析。在笔记本上执行ML管道来预测目标的数量。欧洲足球联盟数据我们都有一项最喜欢的运动,而我的是足球,因为它的全球吸引力,一个惊人的技能和战略的结合,以及极端球迷添加了额外的元素。在本文中,我们将了解如何使用Databricks创建一个端到端的欧洲足球比赛数据管道,包括数据工程、数据分析和机器学习的方面,以帮助回答业务问题。我们将使用来自Kaggle的数据集,它提供了9074场比赛的详细视图,这些比赛来自欧洲最大的5个足球联盟:英格兰、西班牙、德国、意大利和法国,2011至2016赛季。主要数据集是按时间顺序排列的奥运会特定事件,包括以下关键信息:id_odsp–游戏的唯一标识符比赛时间-分钟事件类型–主要事件event_team–制作活动的团队玩家–参与主要活动的玩家的姓名shot_place–放置快照,13个可能的放置位置shot_结果–4种可能的结果地点-球场上发生事件的地点,19个可能的地点is_goal–如果射门导致进球(包括自己的进球),则为二进制变量还有更多。。第二个较小的数据集包括高级信息和高级统计,每场比赛有一个记录。关键属性是"联赛"、"赛季"、"国家"、"主队"、"客队"和各种市场赔率。数据工程我们首先创建一个ETL笔记本,将两个CSV数据集转换并连接到单个Parquet数据层中,这使我们能够利用DBIO缓存特性进行高性能的大数据查询。提取第一个任务是为更大的游戏事件数据集创建一个数据帧模式,这样读取操作就不会花费时间从数据中推断它。提取后,我们将用特定于数据类型的常量替换感兴趣字段的"null"值,如下面的代码片段所述。从pyspark.sql.types进口*架构=(StructType()。add("id_odsp",StringType()).add("id_event",StringType()).add("sort_order",IntegerType())。add("time",IntegerType()).add("text",StringType()).add("event_type",IntegerType())。add("event_type2",IntegerType()).add("side",IntegerType()).add("event_team",StringType())。add("对手",StringType()).add("player",StringType()).add("player2",StringType())。add("player_in",StringType()).add("player_out",StringType()).add("shot_place",IntegerType())。add("shot_outcome",IntegerType()).add("is_goal",IntegerType()).add("位置",IntegerType())。add("bodypart",IntegerType()).add("assist_method",IntegerType()).add("情境",IntegerType())。add("fast_break",IntegerType()))事件df=(spark.read.csv("/data/eu足球赛事/输入/事件.csv",schema=schema,header=True,ignoreLeadingWhiteSpace=True,ignoreTrailingWhiteSpace=True,null值="NA")事件df=事件df.na.fill({'player':'NA','event_team':'NA','opponent':'NA',"事件类型":99,"事件类型2":99,"快照位置":99,"快照结果":99,"位置":99,"身体部位":99,"辅助方法":99,"情况":99})显示(eventsDf)原始数据(替换了一些null)如下所示:我们还将第二个数据集读入一个DataFrame,因为它包含了我们稍后在分析期间使用的国家名称。游戏信息流=(spark.read.csv("/data/eu足球赛事/输入/银币.csv",inferSchema=True,header=True,ignoreLeadingWhiteSpace=True,ignoreTrailingWhiteSpace=True,null值="NA"))显示(gameInfDf)转化下一步是将数据帧转换并连接成一个。游戏事件数据帧中的许多感兴趣的字段都有数字id,因此我们定义了一个通用的UDF,可以使用查找表将id映射到描述。def mapKeyToVal(映射):定义映射键到值(列):返回映射.get(列)返回udf(mapKeyToVal,StringType())映射的描述存储在DataFrame的新列中。因此,一旦两个数据帧连接起来,我们将过滤掉原始的数值列,以使其尽可能稀疏。我们还将使用QuantileDiscriter根据"time"字段添加一个分类的"time_bin"列。游戏信息流=gaminfdf.with列("国家代码",mapKeyToVal(国家代码映射)("国家"))显示(gameInfDf['id_odsp','country','country'u code'])下一个代码片段使用udf和连接数据帧执行查找。事件df=(事件。withColumn("event_type_str",mapKeyToVal(evtTypeMap)("event_type"))。withColumn("event_type2_str",mapKeyToVal(evttype2map)("event_type2"))。withColumn("side_str",mapKeyToVal(sideMap)("side"))。withColumn("shot_place_str",mapKeyToVal(shotPlaceMap)("shot_place"))。withColumn("shot_outcome_str",mapKeyToVal(shotOutcomeMap)("shot_outcome"))。withColumn("location_str",mapKeyToVal(locationMap)("location"))。withColumn("bodypart_str",mapKeyToVal(bodyPartMap)("bodypart"))。withColumn("assist_method_str",mapKeyToVal(assistMethodMap)("assist_method"))。withColumn("情境",mapKeyToVal(情景地图)("情境")))联合DF=(事件df.join(gameInfDf,事件df.id_odsp== gameInfDf.id_odsp,'内部')。选择(事件df.id_odsp, 事件df.id_事件, 事件排序顺序, 时间事件SDF, 事件df.event_类型, 事件df.event_type_str, 事件df.event_类型2, 事件df.event_type2_str, 事件DF.side, 事件DF.side\U str, eventsDf.event_团队, 事件df.opponent, 事件df.player, 事件df.player2, 事件df.player_in, 事件df.player_out, 活动地点, 事件df.shot_place_str, 事件df.shot_结果, 事件df.shot_outcome_str, 活动目标, 事件df.location, 事件df.location\u str, 事件df.bodypart, 事件Df.bodypart_str, 事件df.assist_方法, 事件df.assist_method_str, 事件df.situation, 事件和情况, gameinfd.country_代码))加载一旦数据处于所需的形状,我们将把它作为Parquet加载到Spark表中,该表将驻留在特定于域的数据库中。数据库和表将注册到内部Databricks metastore,数据将存储在DBFS中。我们将在写入期间按"country_code"对拼花地板数据进行分区。%sql语言--创建Databricks/Spark数据库创建数据库(如果不存在EURO_足球数据库)位置"dbfs:/FileStore/databricks abhinav/eu soccer events/interm"--设置数据库会话使用欧洲足球--将转换后的游戏事件数据加载到Databricks/Spark表中joinedDf.write.saveAsTable("游戏事件",format="parquet",mode="overwrite",partitionBy="COUNTRY_CODE",path="dbfs:/FileStore/databricks abhinav/eu soccer EVENTS/interm/tr EVENTS")数据分析现在数据的形状和格式都已经设置好了,现在是时候深入研究并尝试找到一些业务问题的答案了。为此,我们将使用普通的超强SQL(sparksql),并从数据分析师的角度创建第二个笔记本。例如,如果一个人想通过镜头位置来查看目标的分布,那么它可以看起来像这个简单的查询和结果饼图(或者可以作为数据网格查看)。%sql语言当shot_place_str=='NA'时选择CASE,然后选择'Unknown'否则shot_place_str END shot_place,计数(1)作为总进球从游戏事件何处的目标=1按shot_place_str分组或者,如果要求查看按国家/联盟划分的目标分布情况,则可以像这样的地图可视化(需要ISO国家代码,或美国州代码作为列)。%sql语言选择国家代码,计数(1)作为总目标从游戏事件何处的目标=1按国家代码分组一旦我们观察到西甲联赛在这段时间内进球最多,我们就可以通过使用sparksql中的窗口函数编写一个更复杂的查询,从西班牙的比赛中找到每个射门位置前3个进球的位置。它将是一个逐步嵌套的查询:%sql语言选择SHOT\u PLACE\u STR、LOCATION\u STR、TOT\u GOALS从(选择SHOT\u PLACE\u STR、LOCATION\u STR、TOT\u GOALS,RANK()超过(按快照划分\u PLACE\u STR ORDER BY TOT\u GOALS DESC)目标\u等级F