代码+案例详解:使用Spark处理大数据最全指南(上)

如今,有不少关于Spark的相关介绍,但很少有人从数据科学家的角度来解释该计算机引擎。因此,本文将试着介绍并详细阐述——如何运行Spark?

 

代码+案例详解:使用Spark处理大数据最全指南(上)

 

一切是如何开始的呢?--- MapReduce(用于大规模数据集的编程模型)

 

假设我们的任务是砍伐森林中的所有树木,有两种选择:

 

· 让戴夫·巴蒂斯塔(美国职业摔跤运动员)用电动电锯把树一棵接一棵地砍掉。

· 找500个普通人用一般的斧头砍伐不同的树。

 

你更喜欢哪种方法?

 

虽然选项1仍然是一些人的选择,但是对选项2的需求促使了MapReduce的出现。

 

在大数据中,巴蒂斯塔的解决方案称为垂直扩展/扩大,就像在单个工作单元中添加/填充大量内存和硬盘一样。

 

而第二种解决方法称为水平扩展/横向扩展。就像把许多普通机器连接在一起(用更少的内存),然后并行使用这些机器。

 

垂直扩展相对于水平扩展而言,有以下几个优势:

 

· 问题规模较小时,速度更快:假设是2棵树。巴蒂斯塔会用那可怕的电锯一下把两棵树砍掉,而两个普通人则还得用斧头砍这两棵树。

· 易于理解:这就是做事的一贯方式,通常按顺序思考问题,这也是整个计算机体系结构和设计的演变过程。

 

而水平扩展优势如下:

 

· 更加便宜:雇佣50个普通人比雇佣一个像巴蒂斯塔这样的人要便宜得多。除此之外,巴蒂斯塔需要很多的照顾和保养,以帮助他保持冷静。他非常敏感,就算对一些小事情也是这样,犹如内存过高的机器。

· 问题规模较大时速度更快:设想一下有1000棵树,1000普通工人VS 巴蒂斯塔。利用水平扩展时,如果面临一个很大的问题,只需要雇佣100或1000个廉价工人即可。但和巴蒂斯塔工作却不是这样。你必须增加内存,而这也意味着需要更多的冷却基础设施和保养费用。

 

代码+案例详解:使用Spark处理大数据最全指南(上)

 

 

MapReduce使第二种选择成为可能,通过允许使用计算机集群进行并行化来实现这种可能性。

 

MapReduce由两个术语组成:

 

映射:

 

其主要是apply/map函数。将数据分成n个组块,并将每个块发送给不同的工作单元 (映射器)。若想对数据行应用某个函数,该工作单元就会照做。

 

归约:

 

使用基于groupby key的某个函数汇总数据。其主要是利用groupby。

 

当然,系统如期工作还有许多事情需要完成。

 

代码+案例详解:使用Spark处理大数据最全指南(上)

 

为什么使用Spark?

 

Hadoop(大数据平台)是引入MapReduce编程范式的首个开源系统,而Spark是使其速度更快(100倍)的系统。

 

Hadoop过去有很多数据传送指令,因为其过去常常将中间结果写入文件系统。

 

这就影响了分析速度。

 

Spark有一个内存模型,因此Spark在工作时不会向磁盘写入太多内容。

 

简单地说,Spark比Hadoop更快,现在很多人都在使用Spark。

 

代码+案例详解:使用Spark处理大数据最全指南(上)

 

开始使用Spark

 

安装Spark本身就是一个令人头痛的问题。

 

如果想了解Spark是如何工作的以及如何真正地使用,建议在社区版在线Databricks上使用Sparks。别担心,这是免费的。

 

传送门:https://databricks.com/try-databricks?utm_source=databricks&utm_medium=homev2tiletest

 

代码+案例详解:使用Spark处理大数据最全指南(上)

 

 

注册并登录后,屏幕会出现以下显示。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 Spark 的电影数据分析代码示例: ```python from pyspark.sql import SparkSession from pyspark.sql.functions import * # 创建 SparkSession spark = SparkSession.builder.appName("MovieAnalysis").getOrCreate() # 读取电影数据集 movies_df = spark.read.format("csv").option("header", "true").load("movies.csv") ratings_df = spark.read.format("csv").option("header", "true").load("ratings.csv") # 电影评分分析 ratings_count_df = ratings_df.groupBy("movieId").count() ratings_count_df.show() # 电影类型分析 genres_df = movies_df.select("genres") genres_df = genres_df.withColumn("genre", explode(split(col("genres"), "\|"))) genre_count_df = genres_df.groupBy("genre").count() genre_count_df.show() # 导演分析 directors_df = movies_df.select("movieId", "directors") ratings_directors_df = ratings_df.join(directors_df, ratings_df.movieId == directors_df.movieId, "left") ratings_directors_df = ratings_directors_df.drop(directors_df.movieId) ratings_directors_df = ratings_directors_df.groupBy("directors").agg(avg(col("rating")).alias("avg_rating")) ratings_directors_df.show() # 演员分析 actors_df = movies_df.select("movieId", "cast") ratings_actors_df = ratings_df.join(actors_df, ratings_df.movieId == actors_df.movieId, "left") ratings_actors_df = ratings_actors_df.drop(actors_df.movieId) ratings_actors_df = ratings_actors_df.groupBy("cast").agg(avg(col("rating")).alias("avg_rating")) ratings_actors_df.show() # 地区分析 countries_df = movies_df.select("movieId", "countries") ratings_countries_df = ratings_df.join(countries_df, ratings_df.movieId == countries_df.movieId, "left") ratings_countries_df = ratings_countries_df.drop(countries_df.movieId) ratings_countries_df = ratings_countries_df.groupBy("countries").agg(avg(col("rating")).alias("avg_rating")) ratings_countries_df.show() # 停止 SparkSession spark.stop() ``` 以上代码读取了两个电影数据集(movies.csv 和 ratings.csv),并使用 Spark 进行了电影评分、电影类型、导演、演员和地区等数据分析。根据具体的数据集和分析需求,代码可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值