PySpark DataFrame教程与演示

PySpark DataFrame 是 PySpark 库中的基本抽象,专为分配的记录处理和操作而设计。它是 Apache Spark 生态系统的重要组成部分,提供了一种强大且绿色的方式来大规模处理结构化信息。

PySpark DataFrame 建立在 Spark 弹性分布式数据集 (RDD) 模型的功能之上,并将其扩展为提供更好程度的表格记录形状,就像 SQL 表或 Pandas DataFrame 一样。


PySpark DataFrame 的优点:

  1. 分布式处理: PySpark DataFrame 基于 Apache Spark 构建,可实现跨机器集群的分布式处理。这导致大规模统计处理任务的整体性能大幅提升。
  2. 易于使用: DataFrame API 是用户友好的,并提供了一个熟悉的类似 SQL 的界面来进行统计操作。这使得面向 SQL 和编程的用户都可以使用它。
  3. 并行处理: DataFrame 允许并行处理统计数据,利用集群的总体功能。这加快了信息评估并减少了处理时间。
  4. 延迟评估:与其他 Spark 添加剂一样,PySpark DataFrame 操作是延迟评估的,这使得 Spark 在实际计算之前优化执行计划。这可以带来更高的性能和资源利用率。
  5. 优化: PySpark DataFrame 由一个 Catalyst 优化器组成,用于优化查询执行计划。这种优化可以通过最小化统计数据混洗和减少不必要的计算来实现高效的问题处理。
  6. 架构和类型安全: PySpark DataFrame 具有架构,可确保记录遵循所描述的形状。这增加了一层信息验证和类型保护。
  7. 集成: PySpark DataFrame 与不同的 Spark 添加剂以及 Spark SQL、MLlib 和 Spark Streaming 无缝集成,为各种事实处理任务提供了一个全面的平台。


PySpark DataFrame 的缺点:

  1. 内存开销:由于额外的元数据和优化系统,DataFrame 引入了一些内存开销。这可能会影响极小数据集的内存利用率。
  2. 学习曲线:虽然 DataFrame API 的设计初衷是让用户感到愉悦,但仍然存在一个熟悉曲线,特别是对于刚接触分散计算理念的用户而言。
  3. 表达能力有限:虽然 DataFrame API 很灵活,但它可能无法涵盖通过减少阶段 RDD 更改执行的所有操作。在某些情况下,客户可能希望恢复到 RDD 来进行独特的自定义操作。
  4. 序列化开销: DataFrame 操作包含统计信息的序列化和反序列化,这会增加开销,特别是对于一流粒度的操作。
  5. 调试挑战:与单机答案相比,调试分配的结构可能更加困难。识别复杂差异和优化中出现的问题可能需要额外的专业知识。
  6. 设置的复杂性:设置 Spark 集群和配置资源可能比使用单个小工具解决方案更复杂。在处理更大的集群时,这种复杂性会增加。

案例:PySpark DataFrame 中将单列拆分为多列
考虑这样一种情况,您有一个 DataFrame,其中有一列包含需要分解为单独列的值。当处理具有存储在单一主题中的复合值的数据时,这很
常见,包括完整的调用或具有 12 个月、月份和日期附加值的日期。

在本教程中,我们将介绍使用 PySpark 将单个列拆分为多个列的技术。

为了将单列分割成多列,PySpark 提供了许多集成功能,其中 cut up() 是最常用的功能。split ()特征采用两个参数:要分割的列和分隔值的分隔符。

以下是有关如何将 PySpark DataFrame 中的单列拆分为多个列的分步手册:

from pyspark.sql import SparkSession  
from pyspark.sql.functions import split  

创建 SparkSession:

spark = SparkSession.builder.appName("SplitColumnExample").getOrCreate()  

创建 DataFrame:
假设您有一个名为 df 的 DataFrame,其中有一列名为 "全名"。我们将把这一列分成 "名 "和 "姓 "两列。

data = [('John Doe',),  
        ('Jane Smith',),  
        ('Michael Johnson',)]  
  
columns = ['Full Name']  
  
df = spark.createDataFrame(data, columns)  


使用 split() 函数
现在,允许我们将 "全名 "列拆分成 "名 "和 "姓 "列,并使用 "split() "功能。

split_col = split(df['Full Name'], ' ')  
df = df.withColumn('First Name', split_col.getItem(0))  
df = df.withColumn('Last Name', split_col.getItem(1))  

整个代码:

# Importing required modules  
from pyspark.sql import SparkSession  
from pyspark.sql.functions import split  
  
# Creating a SparkSession  
spark = SparkSession.builder.appName("SplitColumnExample").getOrCreate()  
  
# Sample data  
data = [('John Doe',),  
        ('Jane Smith',),  
        ('Michael Johnson',)]  
  
columns = ['Full Name']  
  
# Creating the DataFrame  
df = spark.createDataFrame(data, columns)  
  
# 拆分列并创建新列  ;
split_col = split(df['Full Name'], ' ')  
df = df.withColumn('First Name', split_col.getItem(0))  
df = df.withColumn('Last Name', split_col.getItem(1))  
  
# Displaying the result  
df.show()  


另外一种代码:

# installing pyspark  
!pip install pyspark  
  
# importing necessary modules  
from pyspark.sql import SparkSession  
from pyspark.sql.functions import split  
  
# creating SparkSession object  
spark = SparkSession.builder.appName("SplitColumnExample").getOrCreate()  
  
# sample data  
data = [('John,Smith,35',),  
        ('Jane,Doe,28',),  
        ('Michael,Johnson,42',)]  
  
columns = ['Full Name,Age']  
  
# creating the DataFrame  
df = spark.createDataFrame(data, columns)  
  
# splitting the column and creating new columns  
split_col = split(df['Full Name,Age'], ',')  
df = df.withColumn('First Name', split_col.getItem(0))  
df = df.withColumn('Last Name', split_col.getItem(1))  
df = df.withColumn('Age', split_col.getItem(2))  
  
# displaying the result  
df.show()  

PySpark DataFrame 和其他技术一样,有许多优点,也有一些缺点。了解这些优点和缺点有助于您做出明智的选择,判断 PySpark DataFrame 是否适合您的记录处理和分析需求。