PySpark - 处理大规模的数据

礼貌。图片来自Freepik
PySpark是Apache Spark的一个API,这是一个开源的分布式数据处理系统,由加州大学伯克利分校用Scala编程语言开发,用于大数据处理。Spark的开发API有Scala、Java、Python和R语言,它支持一系列工作负载的代码重用--批处理、互动查询、实时分析、机器学习和图形分析。它利用内存缓存和优化的查询执行,对任何规模的数据进行快速数据分析。虽然它没有自己的文件系统,但它支持最流行的文件系统,如Hadoop分布式文件系统(HDFS)、HBase、Cassandra、Amazon S3、Redshift Couchbase,等等。
使用Apache Spark有几个优点。
- 程序在内存中的运行速度比Hadoop MapReduce快100倍,或在磁盘上快10倍,因为它在工作节点的主内存中执行处理,避免了不必要的I/O操作。
- 由于它有用流行语言编写的API,它很容易被你的开发人员使用,因为它把分布式处理的复杂性隐藏在简单的高级运算符后面,极大地减少了所需的代码量。
- 它可以使用Mesos、通过Yarn的Hadoop或Spark的集群管理器进行部署。
- 内存计算提供了低延迟的实时计算。
工业应用
几乎每个行业都围绕着大数据,有大数据的地方就有分析。让我们仔细看看使用Apache Spark的各个行业。
- Apache Spark的实时处理能力也发挥了重要作用。 金融行业.除了访问和分析社交媒体资料,银行也在使用Spark来获得洞察力,以协助他们做出有关信贷风险评估、定向广告和客户细分的最佳商业决策。Spark也被用来减少客户流失,而欺诈检测是机器学习最广泛使用的领域之一。
- Spotify或Netflix淘宝网使用Apache Spark向其客户提供个性化的在线推荐。该公司每天处理4500亿个事件,路由到服务器端的应用程序。
- 人们无法想象,零售和电子商务行业的运作没有使用分析与预测技术。 有针对性的广告.Target是世界上最大的电子商务平台之一。他们在全球范围内运行一些巨大的Spark Jobs来分析PB级的数据。他们从图像数据中提取特征。eBay使用Apache Spark来提供有针对性的报价,增强客户体验并优化整体性能。
- 医疗保健供应商使用Apache Spark来分析病人记录和过去的临床数据,以确定出院后可能出现健康问题的病人。为了减少处理基因组数据所需的时间,Apache Spark被用于基因组测序。
- 除了使用Apache Spark之外,还 旅游业使用它。通过比较数以百计的网站,为客户找到最好的酒店价格,TripAdvisor,一个帮助用户计划完美旅行的领先旅游网站,正在使用Apache Spark来加速其个性化的客户推荐。比较数以百计的网站,TripAdvisor使用Apache Spark为数百万的旅行者提供建议。
A.开始使用Spark
从2.0版本开始,SparkSession已经成为PySpark的主要入口,而早期版本则使用SparkContext作为入口。SparkSession通过PySpark的底层功能实现了PySpark RDDs、DataFrames和Datasets的程序化创建。它可以用来替代SQLContext、HiveContext和其他在2.0版本之前定义的上下文。此外SparkSession在内部根据SparkSession提供的配置创建SparkConfig和SparkContext。一个SparkSession可以使用SparkSession.builder模式来创建。
- 首先,请确保安装 PySpark 版本 3.0.1或以上版本。为了在Java虚拟机上运行Python程序,我们需要安装 Py4J.Py4J允许通过解释器执行Python程序来动态地访问Java对象。安装上述软件包的命令是。
!pip install pyspark==3.0.1 py4j==0.10.9
创建SparkSession
为了创建一个SparkSession,我们需要一个方法builder()
- **getOrCreate() -**在SparkSession不存在的情况下,该方法创建一个新的SparkSession。
- master()- 如果在集群上运行,你需要使用你的主站名称作为参数。通常情况下,它是yarn 或mesos,取决于你的集群设置,在独立模式下,它也使用 ***local[X]***当在独立模式下运行时,它也使用X应该是一个大于0的整数,代表使用RDD、DataFrame和Dataset时应该创建多少个分区。理想情况下,X值应该是CPU核心的数量。
- **appName() -**这个方法用来设置你的应用程序的名称。
- getOrCreate()- 如果现有的SparkSession已经存在,该方法会返回它;否则,它会创建一个新的SparkSession。
# Import SparkSession module from pyspark.sql package
# where the * represents all the cores of the CPU.
B.数据结构和读/写操作
PySpark的读取方法允许灵活地从几种文件格式中摄取数据,如CSV、JSON和Parquet。在下面的例子中,我们将演示如何从各种文件格式中读取数据。
# Read CSV File
# Read Parquet File
# Read JSON File
Spark模式指的是数据框架或数据集的结构。它可以用StructType类来定义,它是一个StructFields的集合,指定了列名(String)、列类型(DataType)、可归零列(Boolean)和元数据。尽管spark从数据中推断出模式,但有时可能不正确,或者我们可能需要定义我们的列名和数据类型,特别是在处理非结构化或半结构化信息时。
# Before structuring schema
C.数据检查和操作
以下方法用于检查数据:schema, dtypes, show, head, first, take, describe, columns, count, distinct, printSchema。

礼尚往来。作者提供的图片
这里有几个不同的方法用于添加、更新和删除数据的列。
新列。要在现有数据中添加一个新列,请使用 withColumn方法。这个方法需要两个参数,列名和数据。
# Add a new Column
更新列。你可以通过使用以下方法来更新一个当前列 withColumnRenamed,该方法需要两个参数:现有的列名和新的列名。下面的例子说明了如何做到这一点。
spark_df_json.withColumnRenamed("timestamp",”Datetime”).printSchema()
**删除列。**列可以通过以下方法被删除 下降方法删除列,该方法接收列名并返回数据。
spark_df_json = spark_df_json.drop("timestamp")
D.识别和管理缺失值
# Command to identify Null or Missing values
#Option 2
#Option 3
处理实时数据中的缺失值是将它们编码为NaNs、Blanks或占位符。下面是一些比较流行的处理缺失值的方法。
- **删除。**删除任何一列有缺失值的行。
- **用平均值/中位数替代。**可以用各列的平均数/中位数来替代缺失值。这是一个简单而快速的方法,对于小型数字数据集来说效果很好。
- **用模式替代。**为了替换某一列的缺失值,使用最频繁的值。这对分类特征很有效,但可能会导致有偏见的结果。
- 使用KNN进行替代。 KK-NearestNeighbors是一种分类算法,对任何新的数据点使用各种距离度量的特征相似性,如欧几里得、马哈拉诺比斯、曼哈顿、明科夫斯基、汉明等。与传统方法相比,这种方法非常有效,唯一的缺点是计算成本高,对异常值敏感。
# Deal with Missing Values
# Replacing Missing Values with Mean spark_df_json.na.fill(spark_df_json.select(f.mean(spark_df_json['state'])).collect()[0][0])
# Replacing Missing Values with new values spark_df_json.na.replace(old_value, new_vallue)
主要收获
在这篇文章中,我们刚刚开始研究如何在PySpark的帮助下摄入、清理和归纳数据。在接下来的博客中,我已经涵盖了关于数据查询、可视化和机器学习的主题,作为代码和项目的一部分。
其他阅读资源
- 比较计算中的MapReduce和Spark:https://thesai.org/Publications/ViewPaper?Volume=12&Issue=9&Code=IJACSA&SerialNo=37
- Spark软件包:spark-packages.org/
- 文档:spark.apache.org/docs/2.3.0/…
如果你喜欢这篇文章,请关注我,了解更多相关内容。对于新的博客,或文章提醒,请点击订阅。另外,请随时在LinkedIn上与我联系,让我们成为一个有吸引力的网络的一部分。
PySpark--处理大规模数据》最初发表在《Dev Genius》杂志上,人们通过强调和回应这个故事来继续对话。